block: fix warning with calling smp_processor_id() in preemptible section
[pandora-kernel.git] / drivers / staging / tty / serial167.c
1 /*
2  * linux/drivers/char/serial167.c
3  *
4  * Driver for MVME166/7 board serial ports, which are via a CD2401.
5  * Based very much on cyclades.c.
6  *
7  * MVME166/7 work by Richard Hirst [richard@sleepie.demon.co.uk]
8  *
9  * ==============================================================
10  *
11  * static char rcsid[] =
12  * "$Revision: 1.36.1.4 $$Date: 1995/03/29 06:14:14 $";
13  *
14  *  linux/kernel/cyclades.c
15  *
16  * Maintained by Marcio Saito (cyclades@netcom.com) and
17  * Randolph Bentson (bentson@grieg.seaslug.org)
18  *
19  * Much of the design and some of the code came from serial.c
20  * which was copyright (C) 1991, 1992  Linus Torvalds.  It was
21  * extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92,
22  * and then fixed as suggested by Michael K. Johnson 12/12/92.
23  *
24  * This version does not support shared irq's.
25  *
26  * $Log: cyclades.c,v $
27  * Revision 1.36.1.4  1995/03/29  06:14:14  bentson
28  * disambiguate between Cyclom-16Y and Cyclom-32Ye;
29  *
30  * Changes:
31  *
32  * 200 lines of changes record removed - RGH 11-10-95, starting work on
33  * converting this to drive serial ports on mvme166 (cd2401).
34  *
35  * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 2000/08/25
36  * - get rid of verify_area
37  * - use get_user to access memory from userspace in set_threshold,
38  *   set_default_threshold and set_timeout
39  * - don't use the panic function in serial167_init
40  * - do resource release on failure on serial167_init
41  * - include missing restore_flags in mvme167_serial_console_setup
42  *
43  * Kars de Jong <jongk@linux-m68k.org> - 2004/09/06
44  * - replace bottom half handler with task queue handler
45  */
46
47 #include <linux/errno.h>
48 #include <linux/signal.h>
49 #include <linux/sched.h>
50 #include <linux/timer.h>
51 #include <linux/tty.h>
52 #include <linux/interrupt.h>
53 #include <linux/serial.h>
54 #include <linux/serialP.h>
55 #include <linux/string.h>
56 #include <linux/fcntl.h>
57 #include <linux/ptrace.h>
58 #include <linux/serial167.h>
59 #include <linux/delay.h>
60 #include <linux/major.h>
61 #include <linux/mm.h>
62 #include <linux/console.h>
63 #include <linux/module.h>
64 #include <linux/bitops.h>
65 #include <linux/tty_flip.h>
66 #include <linux/gfp.h>
67
68 #include <asm/system.h>
69 #include <asm/io.h>
70 #include <asm/mvme16xhw.h>
71 #include <asm/bootinfo.h>
72 #include <asm/setup.h>
73
74 #include <linux/types.h>
75 #include <linux/kernel.h>
76
77 #include <asm/uaccess.h>
78 #include <linux/init.h>
79
80 #define SERIAL_PARANOIA_CHECK
81 #undef  SERIAL_DEBUG_OPEN
82 #undef  SERIAL_DEBUG_THROTTLE
83 #undef  SERIAL_DEBUG_OTHER
84 #undef  SERIAL_DEBUG_IO
85 #undef  SERIAL_DEBUG_COUNT
86 #undef  SERIAL_DEBUG_DTR
87 #undef  CYCLOM_16Y_HACK
88 #define  CYCLOM_ENABLE_MONITORING
89
90 #define WAKEUP_CHARS 256
91
92 #define STD_COM_FLAGS (0)
93
94 static struct tty_driver *cy_serial_driver;
95 extern int serial_console;
96 static struct cyclades_port *serial_console_info = NULL;
97 static unsigned int serial_console_cflag = 0;
98 u_char initial_console_speed;
99
100 /* Base address of cd2401 chip on mvme166/7 */
101
102 #define BASE_ADDR (0xfff45000)
103 #define pcc2chip        ((volatile u_char *)0xfff42000)
104 #define PccSCCMICR      0x1d
105 #define PccSCCTICR      0x1e
106 #define PccSCCRICR      0x1f
107 #define PccTPIACKR      0x25
108 #define PccRPIACKR      0x27
109 #define PccIMLR         0x3f
110
111 /* This is the per-port data structure */
112 struct cyclades_port cy_port[] = {
113         /* CARD#  */
114         {-1},                   /* ttyS0 */
115         {-1},                   /* ttyS1 */
116         {-1},                   /* ttyS2 */
117         {-1},                   /* ttyS3 */
118 };
119
120 #define NR_PORTS        ARRAY_SIZE(cy_port)
121
122 /*
123  * This is used to look up the divisor speeds and the timeouts
124  * We're normally limited to 15 distinct baud rates.  The extra
125  * are accessed via settings in info->flags.
126  *         0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
127  *        10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
128  *                                                  HI            VHI
129  */
130 static int baud_table[] = {
131         0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
132         1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
133         0
134 };
135
136 #if 0
137 static char baud_co[] = {       /* 25 MHz clock option table */
138         /* value =>    00    01   02    03    04 */
139         /* divide by    8    32   128   512  2048 */
140         0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
141         0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
142 };
143
144 static char baud_bpr[] = {      /* 25 MHz baud rate period table */
145         0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
146         0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
147 };
148 #endif
149
150 /* I think 166 brd clocks 2401 at 20MHz.... */
151
152 /* These values are written directly to tcor, and >> 5 for writing to rcor */
153 static u_char baud_co[] = {     /* 20 MHz clock option table */
154         0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x60, 0x60, 0x40,
155         0x40, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
156 };
157
158 /* These values written directly to tbpr/rbpr */
159 static u_char baud_bpr[] = {    /* 20 MHz baud rate period table */
160         0x00, 0xc0, 0x80, 0x58, 0x6c, 0x40, 0xc0, 0x81, 0x40, 0x81,
161         0x57, 0x40, 0x81, 0x40, 0x81, 0x40, 0x2b, 0x20, 0x15, 0x10
162 };
163
164 static u_char baud_cor4[] = {   /* receive threshold */
165         0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
166         0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07
167 };
168
169 static void shutdown(struct cyclades_port *);
170 static int startup(struct cyclades_port *);
171 static void cy_throttle(struct tty_struct *);
172 static void cy_unthrottle(struct tty_struct *);
173 static void config_setup(struct cyclades_port *);
174 #ifdef CYCLOM_SHOW_STATUS
175 static void show_status(int);
176 #endif
177
178 /*
179  * I have my own version of udelay(), as it is needed when initialising
180  * the chip, before the delay loop has been calibrated.  Should probably
181  * reference one of the vmechip2 or pccchip2 counter for an accurate
182  * delay, but this wild guess will do for now.
183  */
184
185 void my_udelay(long us)
186 {
187         u_char x;
188         volatile u_char *p = &x;
189         int i;
190
191         while (us--)
192                 for (i = 100; i; i--)
193                         x |= *p;
194 }
195
196 static inline int serial_paranoia_check(struct cyclades_port *info, char *name,
197                 const char *routine)
198 {
199 #ifdef SERIAL_PARANOIA_CHECK
200         if (!info) {
201                 printk("Warning: null cyclades_port for (%s) in %s\n", name,
202                                 routine);
203                 return 1;
204         }
205
206         if (info < &cy_port[0] || info >= &cy_port[NR_PORTS]) {
207                 printk("Warning: cyclades_port out of range for (%s) in %s\n",
208                                 name, routine);
209                 return 1;
210         }
211
212         if (info->magic != CYCLADES_MAGIC) {
213                 printk("Warning: bad magic number for serial struct (%s) in "
214                                 "%s\n", name, routine);
215                 return 1;
216         }
217 #endif
218         return 0;
219 }                               /* serial_paranoia_check */
220
221 #if 0
222 /* The following diagnostic routines allow the driver to spew
223    information on the screen, even (especially!) during interrupts.
224  */
225 void SP(char *data)
226 {
227         unsigned long flags;
228         local_irq_save(flags);
229         printk(KERN_EMERG "%s", data);
230         local_irq_restore(flags);
231 }
232
233 char scrn[2];
234 void CP(char data)
235 {
236         unsigned long flags;
237         local_irq_save(flags);
238         scrn[0] = data;
239         printk(KERN_EMERG "%c", scrn);
240         local_irq_restore(flags);
241 }                               /* CP */
242
243 void CP1(int data)
244 {
245         (data < 10) ? CP(data + '0') : CP(data + 'A' - 10);
246 }                               /* CP1 */
247 void CP2(int data)
248 {
249         CP1((data >> 4) & 0x0f);
250         CP1(data & 0x0f);
251 }                               /* CP2 */
252 void CP4(int data)
253 {
254         CP2((data >> 8) & 0xff);
255         CP2(data & 0xff);
256 }                               /* CP4 */
257 void CP8(long data)
258 {
259         CP4((data >> 16) & 0xffff);
260         CP4(data & 0xffff);
261 }                               /* CP8 */
262 #endif
263
264 /* This routine waits up to 1000 micro-seconds for the previous
265    command to the Cirrus chip to complete and then issues the
266    new command.  An error is returned if the previous command
267    didn't finish within the time limit.
268  */
269 u_short write_cy_cmd(volatile u_char * base_addr, u_char cmd)
270 {
271         unsigned long flags;
272         volatile int i;
273
274         local_irq_save(flags);
275         /* Check to see that the previous command has completed */
276         for (i = 0; i < 100; i++) {
277                 if (base_addr[CyCCR] == 0) {
278                         break;
279                 }
280                 my_udelay(10L);
281         }
282         /* if the CCR never cleared, the previous command
283            didn't finish within the "reasonable time" */
284         if (i == 10) {
285                 local_irq_restore(flags);
286                 return (-1);
287         }
288
289         /* Issue the new command */
290         base_addr[CyCCR] = cmd;
291         local_irq_restore(flags);
292         return (0);
293 }                               /* write_cy_cmd */
294
295 /* cy_start and cy_stop provide software output flow control as a
296    function of XON/XOFF, software CTS, and other such stuff. */
297
298 static void cy_stop(struct tty_struct *tty)
299 {
300         struct cyclades_port *info = tty->driver_data;
301         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
302         int channel;
303         unsigned long flags;
304
305 #ifdef SERIAL_DEBUG_OTHER
306         printk("cy_stop %s\n", tty->name);      /* */
307 #endif
308
309         if (serial_paranoia_check(info, tty->name, "cy_stop"))
310                 return;
311
312         channel = info->line;
313
314         local_irq_save(flags);
315         base_addr[CyCAR] = (u_char) (channel);  /* index channel */
316         base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
317         local_irq_restore(flags);
318 }                               /* cy_stop */
319
320 static void cy_start(struct tty_struct *tty)
321 {
322         struct cyclades_port *info = tty->driver_data;
323         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
324         int channel;
325         unsigned long flags;
326
327 #ifdef SERIAL_DEBUG_OTHER
328         printk("cy_start %s\n", tty->name);     /* */
329 #endif
330
331         if (serial_paranoia_check(info, tty->name, "cy_start"))
332                 return;
333
334         channel = info->line;
335
336         local_irq_save(flags);
337         base_addr[CyCAR] = (u_char) (channel);
338         base_addr[CyIER] |= CyTxMpty;
339         local_irq_restore(flags);
340 }                               /* cy_start */
341
342 /* The real interrupt service routines are called
343    whenever the card wants its hand held--chars
344    received, out buffer empty, modem change, etc.
345  */
346 static irqreturn_t cd2401_rxerr_interrupt(int irq, void *dev_id)
347 {
348         struct tty_struct *tty;
349         struct cyclades_port *info;
350         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
351         unsigned char err, rfoc;
352         int channel;
353         char data;
354
355         /* determine the channel and change to that context */
356         channel = (u_short) (base_addr[CyLICR] >> 2);
357         info = &cy_port[channel];
358         info->last_active = jiffies;
359
360         if ((err = base_addr[CyRISR]) & CyTIMEOUT) {
361                 /* This is a receive timeout interrupt, ignore it */
362                 base_addr[CyREOIR] = CyNOTRANS;
363                 return IRQ_HANDLED;
364         }
365
366         /* Read a byte of data if there is any - assume the error
367          * is associated with this character */
368
369         if ((rfoc = base_addr[CyRFOC]) != 0)
370                 data = base_addr[CyRDR];
371         else
372                 data = 0;
373
374         /* if there is nowhere to put the data, discard it */
375         if (info->tty == 0) {
376                 base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
377                 return IRQ_HANDLED;
378         } else {                /* there is an open port for this data */
379                 tty = info->tty;
380                 if (err & info->ignore_status_mask) {
381                         base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
382                         return IRQ_HANDLED;
383                 }
384                 if (tty_buffer_request_room(tty, 1) != 0) {
385                         if (err & info->read_status_mask) {
386                                 if (err & CyBREAK) {
387                                         tty_insert_flip_char(tty, data,
388                                                              TTY_BREAK);
389                                         if (info->flags & ASYNC_SAK) {
390                                                 do_SAK(tty);
391                                         }
392                                 } else if (err & CyFRAME) {
393                                         tty_insert_flip_char(tty, data,
394                                                              TTY_FRAME);
395                                 } else if (err & CyPARITY) {
396                                         tty_insert_flip_char(tty, data,
397                                                              TTY_PARITY);
398                                 } else if (err & CyOVERRUN) {
399                                         tty_insert_flip_char(tty, 0,
400                                                              TTY_OVERRUN);
401                                         /*
402                                            If the flip buffer itself is
403                                            overflowing, we still lose
404                                            the next incoming character.
405                                          */
406                                         if (tty_buffer_request_room(tty, 1) !=
407                                             0) {
408                                                 tty_insert_flip_char(tty, data,
409                                                                      TTY_FRAME);
410                                         }
411                                         /* These two conditions may imply */
412                                         /* a normal read should be done. */
413                                         /* else if(data & CyTIMEOUT) */
414                                         /* else if(data & CySPECHAR) */
415                                 } else {
416                                         tty_insert_flip_char(tty, 0,
417                                                              TTY_NORMAL);
418                                 }
419                         } else {
420                                 tty_insert_flip_char(tty, data, TTY_NORMAL);
421                         }
422                 } else {
423                         /* there was a software buffer overrun
424                            and nothing could be done about it!!! */
425                 }
426         }
427         tty_schedule_flip(tty);
428         /* end of service */
429         base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
430         return IRQ_HANDLED;
431 }                               /* cy_rxerr_interrupt */
432
433 static irqreturn_t cd2401_modem_interrupt(int irq, void *dev_id)
434 {
435         struct cyclades_port *info;
436         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
437         int channel;
438         int mdm_change;
439         int mdm_status;
440
441         /* determine the channel and change to that context */
442         channel = (u_short) (base_addr[CyLICR] >> 2);
443         info = &cy_port[channel];
444         info->last_active = jiffies;
445
446         mdm_change = base_addr[CyMISR];
447         mdm_status = base_addr[CyMSVR1];
448
449         if (info->tty == 0) {   /* nowhere to put the data, ignore it */
450                 ;
451         } else {
452                 if ((mdm_change & CyDCD)
453                     && (info->flags & ASYNC_CHECK_CD)) {
454                         if (mdm_status & CyDCD) {
455 /* CP('!'); */
456                                 wake_up_interruptible(&info->open_wait);
457                         } else {
458 /* CP('@'); */
459                                 tty_hangup(info->tty);
460                                 wake_up_interruptible(&info->open_wait);
461                                 info->flags &= ~ASYNC_NORMAL_ACTIVE;
462                         }
463                 }
464                 if ((mdm_change & CyCTS)
465                     && (info->flags & ASYNC_CTS_FLOW)) {
466                         if (info->tty->stopped) {
467                                 if (mdm_status & CyCTS) {
468                                         /* !!! cy_start isn't used because... */
469                                         info->tty->stopped = 0;
470                                         base_addr[CyIER] |= CyTxMpty;
471                                         tty_wakeup(info->tty);
472                                 }
473                         } else {
474                                 if (!(mdm_status & CyCTS)) {
475                                         /* !!! cy_stop isn't used because... */
476                                         info->tty->stopped = 1;
477                                         base_addr[CyIER] &=
478                                             ~(CyTxMpty | CyTxRdy);
479                                 }
480                         }
481                 }
482                 if (mdm_status & CyDSR) {
483                 }
484         }
485         base_addr[CyMEOIR] = 0;
486         return IRQ_HANDLED;
487 }                               /* cy_modem_interrupt */
488
489 static irqreturn_t cd2401_tx_interrupt(int irq, void *dev_id)
490 {
491         struct cyclades_port *info;
492         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
493         int channel;
494         int char_count, saved_cnt;
495         int outch;
496
497         /* determine the channel and change to that context */
498         channel = (u_short) (base_addr[CyLICR] >> 2);
499
500         /* validate the port number (as configured and open) */
501         if ((channel < 0) || (NR_PORTS <= channel)) {
502                 base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
503                 base_addr[CyTEOIR] = CyNOTRANS;
504                 return IRQ_HANDLED;
505         }
506         info = &cy_port[channel];
507         info->last_active = jiffies;
508         if (info->tty == 0) {
509                 base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
510                 base_addr[CyTEOIR] = CyNOTRANS;
511                 return IRQ_HANDLED;
512         }
513
514         /* load the on-chip space available for outbound data */
515         saved_cnt = char_count = base_addr[CyTFTC];
516
517         if (info->x_char) {     /* send special char */
518                 outch = info->x_char;
519                 base_addr[CyTDR] = outch;
520                 char_count--;
521                 info->x_char = 0;
522         }
523
524         if (info->x_break) {
525                 /*  The Cirrus chip requires the "Embedded Transmit
526                    Commands" of start break, delay, and end break
527                    sequences to be sent.  The duration of the
528                    break is given in TICs, which runs at HZ
529                    (typically 100) and the PPR runs at 200 Hz,
530                    so the delay is duration * 200/HZ, and thus a
531                    break can run from 1/100 sec to about 5/4 sec.
532                    Need to check these values - RGH 141095.
533                  */
534                 base_addr[CyTDR] = 0;   /* start break */
535                 base_addr[CyTDR] = 0x81;
536                 base_addr[CyTDR] = 0;   /* delay a bit */
537                 base_addr[CyTDR] = 0x82;
538                 base_addr[CyTDR] = info->x_break * 200 / HZ;
539                 base_addr[CyTDR] = 0;   /* terminate break */
540                 base_addr[CyTDR] = 0x83;
541                 char_count -= 7;
542                 info->x_break = 0;
543         }
544
545         while (char_count > 0) {
546                 if (!info->xmit_cnt) {
547                         base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
548                         break;
549                 }
550                 if (info->xmit_buf == 0) {
551                         base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
552                         break;
553                 }
554                 if (info->tty->stopped || info->tty->hw_stopped) {
555                         base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
556                         break;
557                 }
558                 /* Because the Embedded Transmit Commands have been
559                    enabled, we must check to see if the escape
560                    character, NULL, is being sent.  If it is, we
561                    must ensure that there is room for it to be
562                    doubled in the output stream.  Therefore we
563                    no longer advance the pointer when the character
564                    is fetched, but rather wait until after the check
565                    for a NULL output character. (This is necessary
566                    because there may not be room for the two chars
567                    needed to send a NULL.
568                  */
569                 outch = info->xmit_buf[info->xmit_tail];
570                 if (outch) {
571                         info->xmit_cnt--;
572                         info->xmit_tail = (info->xmit_tail + 1)
573                             & (PAGE_SIZE - 1);
574                         base_addr[CyTDR] = outch;
575                         char_count--;
576                 } else {
577                         if (char_count > 1) {
578                                 info->xmit_cnt--;
579                                 info->xmit_tail = (info->xmit_tail + 1)
580                                     & (PAGE_SIZE - 1);
581                                 base_addr[CyTDR] = outch;
582                                 base_addr[CyTDR] = 0;
583                                 char_count--;
584                                 char_count--;
585                         } else {
586                                 break;
587                         }
588                 }
589         }
590
591         if (info->xmit_cnt < WAKEUP_CHARS)
592                 tty_wakeup(info->tty);
593
594         base_addr[CyTEOIR] = (char_count != saved_cnt) ? 0 : CyNOTRANS;
595         return IRQ_HANDLED;
596 }                               /* cy_tx_interrupt */
597
598 static irqreturn_t cd2401_rx_interrupt(int irq, void *dev_id)
599 {
600         struct tty_struct *tty;
601         struct cyclades_port *info;
602         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
603         int channel;
604         char data;
605         int char_count;
606         int save_cnt;
607
608         /* determine the channel and change to that context */
609         channel = (u_short) (base_addr[CyLICR] >> 2);
610         info = &cy_port[channel];
611         info->last_active = jiffies;
612         save_cnt = char_count = base_addr[CyRFOC];
613
614                 /* if there is nowhere to put the data, discard it */
615         if (info->tty == 0) {
616                 while (char_count--) {
617                         data = base_addr[CyRDR];
618                 }
619         } else {                /* there is an open port for this data */
620                 tty = info->tty;
621                 /* load # characters available from the chip */
622
623 #ifdef CYCLOM_ENABLE_MONITORING
624                 ++info->mon.int_count;
625                 info->mon.char_count += char_count;
626                 if (char_count > info->mon.char_max)
627                         info->mon.char_max = char_count;
628                 info->mon.char_last = char_count;
629 #endif
630                 while (char_count--) {
631                         data = base_addr[CyRDR];
632                         tty_insert_flip_char(tty, data, TTY_NORMAL);
633 #ifdef CYCLOM_16Y_HACK
634                         udelay(10L);
635 #endif
636                 }
637                 tty_schedule_flip(tty);
638         }
639         /* end of service */
640         base_addr[CyREOIR] = save_cnt ? 0 : CyNOTRANS;
641         return IRQ_HANDLED;
642 }                               /* cy_rx_interrupt */
643
644 /* This is called whenever a port becomes active;
645    interrupts are enabled and DTR & RTS are turned on.
646  */
647 static int startup(struct cyclades_port *info)
648 {
649         unsigned long flags;
650         volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
651         int channel;
652
653         if (info->flags & ASYNC_INITIALIZED) {
654                 return 0;
655         }
656
657         if (!info->type) {
658                 if (info->tty) {
659                         set_bit(TTY_IO_ERROR, &info->tty->flags);
660                 }
661                 return 0;
662         }
663         if (!info->xmit_buf) {
664                 info->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
665                 if (!info->xmit_buf) {
666                         return -ENOMEM;
667                 }
668         }
669
670         config_setup(info);
671
672         channel = info->line;
673
674 #ifdef SERIAL_DEBUG_OPEN
675         printk("startup channel %d\n", channel);
676 #endif
677
678         local_irq_save(flags);
679         base_addr[CyCAR] = (u_char) channel;
680         write_cy_cmd(base_addr, CyENB_RCVR | CyENB_XMTR);
681
682         base_addr[CyCAR] = (u_char) channel;    /* !!! Is this needed? */
683         base_addr[CyMSVR1] = CyRTS;
684 /* CP('S');CP('1'); */
685         base_addr[CyMSVR2] = CyDTR;
686
687 #ifdef SERIAL_DEBUG_DTR
688         printk("cyc: %d: raising DTR\n", __LINE__);
689         printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
690                base_addr[CyMSVR2]);
691 #endif
692
693         base_addr[CyIER] |= CyRxData;
694         info->flags |= ASYNC_INITIALIZED;
695
696         if (info->tty) {
697                 clear_bit(TTY_IO_ERROR, &info->tty->flags);
698         }
699         info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
700
701         local_irq_restore(flags);
702
703 #ifdef SERIAL_DEBUG_OPEN
704         printk(" done\n");
705 #endif
706         return 0;
707 }                               /* startup */
708
709 void start_xmit(struct cyclades_port *info)
710 {
711         unsigned long flags;
712         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
713         int channel;
714
715         channel = info->line;
716         local_irq_save(flags);
717         base_addr[CyCAR] = channel;
718         base_addr[CyIER] |= CyTxMpty;
719         local_irq_restore(flags);
720 }                               /* start_xmit */
721
722 /*
723  * This routine shuts down a serial port; interrupts are disabled,
724  * and DTR is dropped if the hangup on close termio flag is on.
725  */
726 static void shutdown(struct cyclades_port *info)
727 {
728         unsigned long flags;
729         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
730         int channel;
731
732         if (!(info->flags & ASYNC_INITIALIZED)) {
733 /* CP('$'); */
734                 return;
735         }
736
737         channel = info->line;
738
739 #ifdef SERIAL_DEBUG_OPEN
740         printk("shutdown channel %d\n", channel);
741 #endif
742
743         /* !!! REALLY MUST WAIT FOR LAST CHARACTER TO BE
744            SENT BEFORE DROPPING THE LINE !!!  (Perhaps
745            set some flag that is read when XMTY happens.)
746            Other choices are to delay some fixed interval
747            or schedule some later processing.
748          */
749         local_irq_save(flags);
750         if (info->xmit_buf) {
751                 free_page((unsigned long)info->xmit_buf);
752                 info->xmit_buf = NULL;
753         }
754
755         base_addr[CyCAR] = (u_char) channel;
756         if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
757                 base_addr[CyMSVR1] = 0;
758 /* CP('C');CP('1'); */
759                 base_addr[CyMSVR2] = 0;
760 #ifdef SERIAL_DEBUG_DTR
761                 printk("cyc: %d: dropping DTR\n", __LINE__);
762                 printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
763                        base_addr[CyMSVR2]);
764 #endif
765         }
766         write_cy_cmd(base_addr, CyDIS_RCVR);
767         /* it may be appropriate to clear _XMIT at
768            some later date (after testing)!!! */
769
770         if (info->tty) {
771                 set_bit(TTY_IO_ERROR, &info->tty->flags);
772         }
773         info->flags &= ~ASYNC_INITIALIZED;
774         local_irq_restore(flags);
775
776 #ifdef SERIAL_DEBUG_OPEN
777         printk(" done\n");
778 #endif
779 }                               /* shutdown */
780
781 /*
782  * This routine finds or computes the various line characteristics.
783  */
784 static void config_setup(struct cyclades_port *info)
785 {
786         unsigned long flags;
787         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
788         int channel;
789         unsigned cflag;
790         int i;
791         unsigned char ti, need_init_chan = 0;
792
793         if (!info->tty || !info->tty->termios) {
794                 return;
795         }
796         if (info->line == -1) {
797                 return;
798         }
799         cflag = info->tty->termios->c_cflag;
800
801         /* baud rate */
802         i = cflag & CBAUD;
803 #ifdef CBAUDEX
804 /* Starting with kernel 1.1.65, there is direct support for
805    higher baud rates.  The following code supports those
806    changes.  The conditional aspect allows this driver to be
807    used for earlier as well as later kernel versions.  (The
808    mapping is slightly different from serial.c because there
809    is still the possibility of supporting 75 kbit/sec with
810    the Cyclades board.)
811  */
812         if (i & CBAUDEX) {
813                 if (i == B57600)
814                         i = 16;
815                 else if (i == B115200)
816                         i = 18;
817 #ifdef B78600
818                 else if (i == B78600)
819                         i = 17;
820 #endif
821                 else
822                         info->tty->termios->c_cflag &= ~CBAUDEX;
823         }
824 #endif
825         if (i == 15) {
826                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
827                         i += 1;
828                 if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
829                         i += 3;
830         }
831         /* Don't ever change the speed of the console port.  It will
832          * run at the speed specified in bootinfo, or at 19.2K */
833         /* Actually, it should run at whatever speed 166Bug was using */
834         /* Note info->timeout isn't used at present */
835         if (info != serial_console_info) {
836                 info->tbpr = baud_bpr[i];       /* Tx BPR */
837                 info->tco = baud_co[i]; /* Tx CO */
838                 info->rbpr = baud_bpr[i];       /* Rx BPR */
839                 info->rco = baud_co[i] >> 5;    /* Rx CO */
840                 if (baud_table[i] == 134) {
841                         info->timeout =
842                             (info->xmit_fifo_size * HZ * 30 / 269) + 2;
843                         /* get it right for 134.5 baud */
844                 } else if (baud_table[i]) {
845                         info->timeout =
846                             (info->xmit_fifo_size * HZ * 15 / baud_table[i]) +
847                             2;
848                         /* this needs to be propagated into the card info */
849                 } else {
850                         info->timeout = 0;
851                 }
852         }
853         /* By tradition (is it a standard?) a baud rate of zero
854            implies the line should be/has been closed.  A bit
855            later in this routine such a test is performed. */
856
857         /* byte size and parity */
858         info->cor7 = 0;
859         info->cor6 = 0;
860         info->cor5 = 0;
861         info->cor4 = (info->default_threshold ? info->default_threshold : baud_cor4[i]);        /* receive threshold */
862         /* Following two lines added 101295, RGH. */
863         /* It is obviously wrong to access CyCORx, and not info->corx here,
864          * try and remember to fix it later! */
865         channel = info->line;
866         base_addr[CyCAR] = (u_char) channel;
867         if (C_CLOCAL(info->tty)) {
868                 if (base_addr[CyIER] & CyMdmCh)
869                         base_addr[CyIER] &= ~CyMdmCh;   /* without modem intr */
870                 /* ignore 1->0 modem transitions */
871                 if (base_addr[CyCOR4] & (CyDSR | CyCTS | CyDCD))
872                         base_addr[CyCOR4] &= ~(CyDSR | CyCTS | CyDCD);
873                 /* ignore 0->1 modem transitions */
874                 if (base_addr[CyCOR5] & (CyDSR | CyCTS | CyDCD))
875                         base_addr[CyCOR5] &= ~(CyDSR | CyCTS | CyDCD);
876         } else {
877                 if ((base_addr[CyIER] & CyMdmCh) != CyMdmCh)
878                         base_addr[CyIER] |= CyMdmCh;    /* with modem intr */
879                 /* act on 1->0 modem transitions */
880                 if ((base_addr[CyCOR4] & (CyDSR | CyCTS | CyDCD)) !=
881                     (CyDSR | CyCTS | CyDCD))
882                         base_addr[CyCOR4] |= CyDSR | CyCTS | CyDCD;
883                 /* act on 0->1 modem transitions */
884                 if ((base_addr[CyCOR5] & (CyDSR | CyCTS | CyDCD)) !=
885                     (CyDSR | CyCTS | CyDCD))
886                         base_addr[CyCOR5] |= CyDSR | CyCTS | CyDCD;
887         }
888         info->cor3 = (cflag & CSTOPB) ? Cy_2_STOP : Cy_1_STOP;
889         info->cor2 = CyETC;
890         switch (cflag & CSIZE) {
891         case CS5:
892                 info->cor1 = Cy_5_BITS;
893                 break;
894         case CS6:
895                 info->cor1 = Cy_6_BITS;
896                 break;
897         case CS7:
898                 info->cor1 = Cy_7_BITS;
899                 break;
900         case CS8:
901                 info->cor1 = Cy_8_BITS;
902                 break;
903         }
904         if (cflag & PARENB) {
905                 if (cflag & PARODD) {
906                         info->cor1 |= CyPARITY_O;
907                 } else {
908                         info->cor1 |= CyPARITY_E;
909                 }
910         } else {
911                 info->cor1 |= CyPARITY_NONE;
912         }
913
914         /* CTS flow control flag */
915 #if 0
916         /* Don't complcate matters for now! RGH 141095 */
917         if (cflag & CRTSCTS) {
918                 info->flags |= ASYNC_CTS_FLOW;
919                 info->cor2 |= CyCtsAE;
920         } else {
921                 info->flags &= ~ASYNC_CTS_FLOW;
922                 info->cor2 &= ~CyCtsAE;
923         }
924 #endif
925         if (cflag & CLOCAL)
926                 info->flags &= ~ASYNC_CHECK_CD;
927         else
928                 info->flags |= ASYNC_CHECK_CD;
929
930      /***********************************************
931         The hardware option, CyRtsAO, presents RTS when
932         the chip has characters to send.  Since most modems
933         use RTS as reverse (inbound) flow control, this
934         option is not used.  If inbound flow control is
935         necessary, DTR can be programmed to provide the
936         appropriate signals for use with a non-standard
937         cable.  Contact Marcio Saito for details.
938      ***********************************************/
939
940         channel = info->line;
941
942         local_irq_save(flags);
943         base_addr[CyCAR] = (u_char) channel;
944
945         /* CyCMR set once only in mvme167_init_serial() */
946         if (base_addr[CyLICR] != channel << 2)
947                 base_addr[CyLICR] = channel << 2;
948         if (base_addr[CyLIVR] != 0x5c)
949                 base_addr[CyLIVR] = 0x5c;
950
951         /* tx and rx baud rate */
952
953         if (base_addr[CyCOR1] != info->cor1)
954                 need_init_chan = 1;
955         if (base_addr[CyTCOR] != info->tco)
956                 base_addr[CyTCOR] = info->tco;
957         if (base_addr[CyTBPR] != info->tbpr)
958                 base_addr[CyTBPR] = info->tbpr;
959         if (base_addr[CyRCOR] != info->rco)
960                 base_addr[CyRCOR] = info->rco;
961         if (base_addr[CyRBPR] != info->rbpr)
962                 base_addr[CyRBPR] = info->rbpr;
963
964         /* set line characteristics  according configuration */
965
966         if (base_addr[CySCHR1] != START_CHAR(info->tty))
967                 base_addr[CySCHR1] = START_CHAR(info->tty);
968         if (base_addr[CySCHR2] != STOP_CHAR(info->tty))
969                 base_addr[CySCHR2] = STOP_CHAR(info->tty);
970         if (base_addr[CySCRL] != START_CHAR(info->tty))
971                 base_addr[CySCRL] = START_CHAR(info->tty);
972         if (base_addr[CySCRH] != START_CHAR(info->tty))
973                 base_addr[CySCRH] = START_CHAR(info->tty);
974         if (base_addr[CyCOR1] != info->cor1)
975                 base_addr[CyCOR1] = info->cor1;
976         if (base_addr[CyCOR2] != info->cor2)
977                 base_addr[CyCOR2] = info->cor2;
978         if (base_addr[CyCOR3] != info->cor3)
979                 base_addr[CyCOR3] = info->cor3;
980         if (base_addr[CyCOR4] != info->cor4)
981                 base_addr[CyCOR4] = info->cor4;
982         if (base_addr[CyCOR5] != info->cor5)
983                 base_addr[CyCOR5] = info->cor5;
984         if (base_addr[CyCOR6] != info->cor6)
985                 base_addr[CyCOR6] = info->cor6;
986         if (base_addr[CyCOR7] != info->cor7)
987                 base_addr[CyCOR7] = info->cor7;
988
989         if (need_init_chan)
990                 write_cy_cmd(base_addr, CyINIT_CHAN);
991
992         base_addr[CyCAR] = (u_char) channel;    /* !!! Is this needed? */
993
994         /* 2ms default rx timeout */
995         ti = info->default_timeout ? info->default_timeout : 0x02;
996         if (base_addr[CyRTPRL] != ti)
997                 base_addr[CyRTPRL] = ti;
998         if (base_addr[CyRTPRH] != 0)
999                 base_addr[CyRTPRH] = 0;
1000
1001         /* Set up RTS here also ????? RGH 141095 */
1002         if (i == 0) {           /* baud rate is zero, turn off line */
1003                 if ((base_addr[CyMSVR2] & CyDTR) == CyDTR)
1004                         base_addr[CyMSVR2] = 0;
1005 #ifdef SERIAL_DEBUG_DTR
1006                 printk("cyc: %d: dropping DTR\n", __LINE__);
1007                 printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
1008                        base_addr[CyMSVR2]);
1009 #endif
1010         } else {
1011                 if ((base_addr[CyMSVR2] & CyDTR) != CyDTR)
1012                         base_addr[CyMSVR2] = CyDTR;
1013 #ifdef SERIAL_DEBUG_DTR
1014                 printk("cyc: %d: raising DTR\n", __LINE__);
1015                 printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
1016                        base_addr[CyMSVR2]);
1017 #endif
1018         }
1019
1020         if (info->tty) {
1021                 clear_bit(TTY_IO_ERROR, &info->tty->flags);
1022         }
1023
1024         local_irq_restore(flags);
1025
1026 }                               /* config_setup */
1027
1028 static int cy_put_char(struct tty_struct *tty, unsigned char ch)
1029 {
1030         struct cyclades_port *info = tty->driver_data;
1031         unsigned long flags;
1032
1033 #ifdef SERIAL_DEBUG_IO
1034         printk("cy_put_char %s(0x%02x)\n", tty->name, ch);
1035 #endif
1036
1037         if (serial_paranoia_check(info, tty->name, "cy_put_char"))
1038                 return 0;
1039
1040         if (!info->xmit_buf)
1041                 return 0;
1042
1043         local_irq_save(flags);
1044         if (info->xmit_cnt >= PAGE_SIZE - 1) {
1045                 local_irq_restore(flags);
1046                 return 0;
1047         }
1048
1049         info->xmit_buf[info->xmit_head++] = ch;
1050         info->xmit_head &= PAGE_SIZE - 1;
1051         info->xmit_cnt++;
1052         local_irq_restore(flags);
1053         return 1;
1054 }                               /* cy_put_char */
1055
1056 static void cy_flush_chars(struct tty_struct *tty)
1057 {
1058         struct cyclades_port *info = tty->driver_data;
1059         unsigned long flags;
1060         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1061         int channel;
1062
1063 #ifdef SERIAL_DEBUG_IO
1064         printk("cy_flush_chars %s\n", tty->name);       /* */
1065 #endif
1066
1067         if (serial_paranoia_check(info, tty->name, "cy_flush_chars"))
1068                 return;
1069
1070         if (info->xmit_cnt <= 0 || tty->stopped
1071             || tty->hw_stopped || !info->xmit_buf)
1072                 return;
1073
1074         channel = info->line;
1075
1076         local_irq_save(flags);
1077         base_addr[CyCAR] = channel;
1078         base_addr[CyIER] |= CyTxMpty;
1079         local_irq_restore(flags);
1080 }                               /* cy_flush_chars */
1081
1082 /* This routine gets called when tty_write has put something into
1083     the write_queue.  If the port is not already transmitting stuff,
1084     start it off by enabling interrupts.  The interrupt service
1085     routine will then ensure that the characters are sent.  If the
1086     port is already active, there is no need to kick it.
1087  */
1088 static int cy_write(struct tty_struct *tty, const unsigned char *buf, int count)
1089 {
1090         struct cyclades_port *info = tty->driver_data;
1091         unsigned long flags;
1092         int c, total = 0;
1093
1094 #ifdef SERIAL_DEBUG_IO
1095         printk("cy_write %s\n", tty->name);     /* */
1096 #endif
1097
1098         if (serial_paranoia_check(info, tty->name, "cy_write")) {
1099                 return 0;
1100         }
1101
1102         if (!info->xmit_buf) {
1103                 return 0;
1104         }
1105
1106         while (1) {
1107                 local_irq_save(flags);
1108                 c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
1109                                           SERIAL_XMIT_SIZE - info->xmit_head));
1110                 if (c <= 0) {
1111                         local_irq_restore(flags);
1112                         break;
1113                 }
1114
1115                 memcpy(info->xmit_buf + info->xmit_head, buf, c);
1116                 info->xmit_head =
1117                     (info->xmit_head + c) & (SERIAL_XMIT_SIZE - 1);
1118                 info->xmit_cnt += c;
1119                 local_irq_restore(flags);
1120
1121                 buf += c;
1122                 count -= c;
1123                 total += c;
1124         }
1125
1126         if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) {
1127                 start_xmit(info);
1128         }
1129         return total;
1130 }                               /* cy_write */
1131
1132 static int cy_write_room(struct tty_struct *tty)
1133 {
1134         struct cyclades_port *info = tty->driver_data;
1135         int ret;
1136
1137 #ifdef SERIAL_DEBUG_IO
1138         printk("cy_write_room %s\n", tty->name);        /* */
1139 #endif
1140
1141         if (serial_paranoia_check(info, tty->name, "cy_write_room"))
1142                 return 0;
1143         ret = PAGE_SIZE - info->xmit_cnt - 1;
1144         if (ret < 0)
1145                 ret = 0;
1146         return ret;
1147 }                               /* cy_write_room */
1148
1149 static int cy_chars_in_buffer(struct tty_struct *tty)
1150 {
1151         struct cyclades_port *info = tty->driver_data;
1152
1153 #ifdef SERIAL_DEBUG_IO
1154         printk("cy_chars_in_buffer %s %d\n", tty->name, info->xmit_cnt);        /* */
1155 #endif
1156
1157         if (serial_paranoia_check(info, tty->name, "cy_chars_in_buffer"))
1158                 return 0;
1159
1160         return info->xmit_cnt;
1161 }                               /* cy_chars_in_buffer */
1162
1163 static void cy_flush_buffer(struct tty_struct *tty)
1164 {
1165         struct cyclades_port *info = tty->driver_data;
1166         unsigned long flags;
1167
1168 #ifdef SERIAL_DEBUG_IO
1169         printk("cy_flush_buffer %s\n", tty->name);      /* */
1170 #endif
1171
1172         if (serial_paranoia_check(info, tty->name, "cy_flush_buffer"))
1173                 return;
1174         local_irq_save(flags);
1175         info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1176         local_irq_restore(flags);
1177         tty_wakeup(tty);
1178 }                               /* cy_flush_buffer */
1179
1180 /* This routine is called by the upper-layer tty layer to signal
1181    that incoming characters should be throttled or that the
1182    throttle should be released.
1183  */
1184 static void cy_throttle(struct tty_struct *tty)
1185 {
1186         struct cyclades_port *info = tty->driver_data;
1187         unsigned long flags;
1188         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1189         int channel;
1190
1191 #ifdef SERIAL_DEBUG_THROTTLE
1192         char buf[64];
1193
1194         printk("throttle %s: %d....\n", tty_name(tty, buf),
1195                tty->ldisc.chars_in_buffer(tty));
1196         printk("cy_throttle %s\n", tty->name);
1197 #endif
1198
1199         if (serial_paranoia_check(info, tty->name, "cy_nthrottle")) {
1200                 return;
1201         }
1202
1203         if (I_IXOFF(tty)) {
1204                 info->x_char = STOP_CHAR(tty);
1205                 /* Should use the "Send Special Character" feature!!! */
1206         }
1207
1208         channel = info->line;
1209
1210         local_irq_save(flags);
1211         base_addr[CyCAR] = (u_char) channel;
1212         base_addr[CyMSVR1] = 0;
1213         local_irq_restore(flags);
1214 }                               /* cy_throttle */
1215
1216 static void cy_unthrottle(struct tty_struct *tty)
1217 {
1218         struct cyclades_port *info = tty->driver_data;
1219         unsigned long flags;
1220         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1221         int channel;
1222
1223 #ifdef SERIAL_DEBUG_THROTTLE
1224         char buf[64];
1225
1226         printk("throttle %s: %d....\n", tty_name(tty, buf),
1227                tty->ldisc.chars_in_buffer(tty));
1228         printk("cy_unthrottle %s\n", tty->name);
1229 #endif
1230
1231         if (serial_paranoia_check(info, tty->name, "cy_nthrottle")) {
1232                 return;
1233         }
1234
1235         if (I_IXOFF(tty)) {
1236                 info->x_char = START_CHAR(tty);
1237                 /* Should use the "Send Special Character" feature!!! */
1238         }
1239
1240         channel = info->line;
1241
1242         local_irq_save(flags);
1243         base_addr[CyCAR] = (u_char) channel;
1244         base_addr[CyMSVR1] = CyRTS;
1245         local_irq_restore(flags);
1246 }                               /* cy_unthrottle */
1247
1248 static int
1249 get_serial_info(struct cyclades_port *info,
1250                 struct serial_struct __user * retinfo)
1251 {
1252         struct serial_struct tmp;
1253
1254 /* CP('g'); */
1255         if (!retinfo)
1256                 return -EFAULT;
1257         memset(&tmp, 0, sizeof(tmp));
1258         tmp.type = info->type;
1259         tmp.line = info->line;
1260         tmp.port = info->line;
1261         tmp.irq = 0;
1262         tmp.flags = info->flags;
1263         tmp.baud_base = 0;      /*!!! */
1264         tmp.close_delay = info->close_delay;
1265         tmp.custom_divisor = 0; /*!!! */
1266         tmp.hub6 = 0;           /*!!! */
1267         return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0;
1268 }                               /* get_serial_info */
1269
1270 static int
1271 set_serial_info(struct cyclades_port *info,
1272                 struct serial_struct __user * new_info)
1273 {
1274         struct serial_struct new_serial;
1275         struct cyclades_port old_info;
1276
1277 /* CP('s'); */
1278         if (!new_info)
1279                 return -EFAULT;
1280         if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
1281                 return -EFAULT;
1282         old_info = *info;
1283
1284         if (!capable(CAP_SYS_ADMIN)) {
1285                 if ((new_serial.close_delay != info->close_delay) ||
1286                     ((new_serial.flags & ASYNC_FLAGS & ~ASYNC_USR_MASK) !=
1287                      (info->flags & ASYNC_FLAGS & ~ASYNC_USR_MASK)))
1288                         return -EPERM;
1289                 info->flags = ((info->flags & ~ASYNC_USR_MASK) |
1290                                (new_serial.flags & ASYNC_USR_MASK));
1291                 goto check_and_exit;
1292         }
1293
1294         /*
1295          * OK, past this point, all the error checking has been done.
1296          * At this point, we start making changes.....
1297          */
1298
1299         info->flags = ((info->flags & ~ASYNC_FLAGS) |
1300                        (new_serial.flags & ASYNC_FLAGS));
1301         info->close_delay = new_serial.close_delay;
1302
1303 check_and_exit:
1304         if (info->flags & ASYNC_INITIALIZED) {
1305                 config_setup(info);
1306                 return 0;
1307         }
1308         return startup(info);
1309 }                               /* set_serial_info */
1310
1311 static int cy_tiocmget(struct tty_struct *tty)
1312 {
1313         struct cyclades_port *info = tty->driver_data;
1314         int channel;
1315         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1316         unsigned long flags;
1317         unsigned char status;
1318
1319         channel = info->line;
1320
1321         local_irq_save(flags);
1322         base_addr[CyCAR] = (u_char) channel;
1323         status = base_addr[CyMSVR1] | base_addr[CyMSVR2];
1324         local_irq_restore(flags);
1325
1326         return ((status & CyRTS) ? TIOCM_RTS : 0)
1327             | ((status & CyDTR) ? TIOCM_DTR : 0)
1328             | ((status & CyDCD) ? TIOCM_CAR : 0)
1329             | ((status & CyDSR) ? TIOCM_DSR : 0)
1330             | ((status & CyCTS) ? TIOCM_CTS : 0);
1331 }                               /* cy_tiocmget */
1332
1333 static int
1334 cy_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
1335 {
1336         struct cyclades_port *info = tty->driver_data;
1337         int channel;
1338         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1339         unsigned long flags;
1340
1341         channel = info->line;
1342
1343         if (set & TIOCM_RTS) {
1344                 local_irq_save(flags);
1345                 base_addr[CyCAR] = (u_char) channel;
1346                 base_addr[CyMSVR1] = CyRTS;
1347                 local_irq_restore(flags);
1348         }
1349         if (set & TIOCM_DTR) {
1350                 local_irq_save(flags);
1351                 base_addr[CyCAR] = (u_char) channel;
1352 /* CP('S');CP('2'); */
1353                 base_addr[CyMSVR2] = CyDTR;
1354 #ifdef SERIAL_DEBUG_DTR
1355                 printk("cyc: %d: raising DTR\n", __LINE__);
1356                 printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
1357                        base_addr[CyMSVR2]);
1358 #endif
1359                 local_irq_restore(flags);
1360         }
1361
1362         if (clear & TIOCM_RTS) {
1363                 local_irq_save(flags);
1364                 base_addr[CyCAR] = (u_char) channel;
1365                 base_addr[CyMSVR1] = 0;
1366                 local_irq_restore(flags);
1367         }
1368         if (clear & TIOCM_DTR) {
1369                 local_irq_save(flags);
1370                 base_addr[CyCAR] = (u_char) channel;
1371 /* CP('C');CP('2'); */
1372                 base_addr[CyMSVR2] = 0;
1373 #ifdef SERIAL_DEBUG_DTR
1374                 printk("cyc: %d: dropping DTR\n", __LINE__);
1375                 printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
1376                        base_addr[CyMSVR2]);
1377 #endif
1378                 local_irq_restore(flags);
1379         }
1380
1381         return 0;
1382 }                               /* set_modem_info */
1383
1384 static void send_break(struct cyclades_port *info, int duration)
1385 {                               /* Let the transmit ISR take care of this (since it
1386                                    requires stuffing characters into the output stream).
1387                                  */
1388         info->x_break = duration;
1389         if (!info->xmit_cnt) {
1390                 start_xmit(info);
1391         }
1392 }                               /* send_break */
1393
1394 static int
1395 get_mon_info(struct cyclades_port *info, struct cyclades_monitor __user * mon)
1396 {
1397
1398         if (copy_to_user(mon, &info->mon, sizeof(struct cyclades_monitor)))
1399                 return -EFAULT;
1400         info->mon.int_count = 0;
1401         info->mon.char_count = 0;
1402         info->mon.char_max = 0;
1403         info->mon.char_last = 0;
1404         return 0;
1405 }
1406
1407 static int set_threshold(struct cyclades_port *info, unsigned long __user * arg)
1408 {
1409         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1410         unsigned long value;
1411         int channel;
1412
1413         if (get_user(value, arg))
1414                 return -EFAULT;
1415
1416         channel = info->line;
1417         info->cor4 &= ~CyREC_FIFO;
1418         info->cor4 |= value & CyREC_FIFO;
1419         base_addr[CyCOR4] = info->cor4;
1420         return 0;
1421 }
1422
1423 static int
1424 get_threshold(struct cyclades_port *info, unsigned long __user * value)
1425 {
1426         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1427         int channel;
1428         unsigned long tmp;
1429
1430         channel = info->line;
1431
1432         tmp = base_addr[CyCOR4] & CyREC_FIFO;
1433         return put_user(tmp, value);
1434 }
1435
1436 static int
1437 set_default_threshold(struct cyclades_port *info, unsigned long __user * arg)
1438 {
1439         unsigned long value;
1440
1441         if (get_user(value, arg))
1442                 return -EFAULT;
1443
1444         info->default_threshold = value & 0x0f;
1445         return 0;
1446 }
1447
1448 static int
1449 get_default_threshold(struct cyclades_port *info, unsigned long __user * value)
1450 {
1451         return put_user(info->default_threshold, value);
1452 }
1453
1454 static int set_timeout(struct cyclades_port *info, unsigned long __user * arg)
1455 {
1456         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1457         int channel;
1458         unsigned long value;
1459
1460         if (get_user(value, arg))
1461                 return -EFAULT;
1462
1463         channel = info->line;
1464
1465         base_addr[CyRTPRL] = value & 0xff;
1466         base_addr[CyRTPRH] = (value >> 8) & 0xff;
1467         return 0;
1468 }
1469
1470 static int get_timeout(struct cyclades_port *info, unsigned long __user * value)
1471 {
1472         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1473         int channel;
1474         unsigned long tmp;
1475
1476         channel = info->line;
1477
1478         tmp = base_addr[CyRTPRL];
1479         return put_user(tmp, value);
1480 }
1481
1482 static int set_default_timeout(struct cyclades_port *info, unsigned long value)
1483 {
1484         info->default_timeout = value & 0xff;
1485         return 0;
1486 }
1487
1488 static int
1489 get_default_timeout(struct cyclades_port *info, unsigned long __user * value)
1490 {
1491         return put_user(info->default_timeout, value);
1492 }
1493
1494 static int
1495 cy_ioctl(struct tty_struct *tty,
1496          unsigned int cmd, unsigned long arg)
1497 {
1498         struct cyclades_port *info = tty->driver_data;
1499         int ret_val = 0;
1500         void __user *argp = (void __user *)arg;
1501
1502 #ifdef SERIAL_DEBUG_OTHER
1503         printk("cy_ioctl %s, cmd = %x arg = %lx\n", tty->name, cmd, arg);       /* */
1504 #endif
1505
1506         tty_lock();
1507
1508         switch (cmd) {
1509         case CYGETMON:
1510                 ret_val = get_mon_info(info, argp);
1511                 break;
1512         case CYGETTHRESH:
1513                 ret_val = get_threshold(info, argp);
1514                 break;
1515         case CYSETTHRESH:
1516                 ret_val = set_threshold(info, argp);
1517                 break;
1518         case CYGETDEFTHRESH:
1519                 ret_val = get_default_threshold(info, argp);
1520                 break;
1521         case CYSETDEFTHRESH:
1522                 ret_val = set_default_threshold(info, argp);
1523                 break;
1524         case CYGETTIMEOUT:
1525                 ret_val = get_timeout(info, argp);
1526                 break;
1527         case CYSETTIMEOUT:
1528                 ret_val = set_timeout(info, argp);
1529                 break;
1530         case CYGETDEFTIMEOUT:
1531                 ret_val = get_default_timeout(info, argp);
1532                 break;
1533         case CYSETDEFTIMEOUT:
1534                 ret_val = set_default_timeout(info, (unsigned long)arg);
1535                 break;
1536         case TCSBRK:            /* SVID version: non-zero arg --> no break */
1537                 ret_val = tty_check_change(tty);
1538                 if (ret_val)
1539                         break;
1540                 tty_wait_until_sent(tty, 0);
1541                 if (!arg)
1542                         send_break(info, HZ / 4);       /* 1/4 second */
1543                 break;
1544         case TCSBRKP:           /* support for POSIX tcsendbreak() */
1545                 ret_val = tty_check_change(tty);
1546                 if (ret_val)
1547                         break;
1548                 tty_wait_until_sent(tty, 0);
1549                 send_break(info, arg ? arg * (HZ / 10) : HZ / 4);
1550                 break;
1551
1552 /* The following commands are incompletely implemented!!! */
1553         case TIOCGSERIAL:
1554                 ret_val = get_serial_info(info, argp);
1555                 break;
1556         case TIOCSSERIAL:
1557                 ret_val = set_serial_info(info, argp);
1558                 break;
1559         default:
1560                 ret_val = -ENOIOCTLCMD;
1561         }
1562         tty_unlock();
1563
1564 #ifdef SERIAL_DEBUG_OTHER
1565         printk("cy_ioctl done\n");
1566 #endif
1567
1568         return ret_val;
1569 }                               /* cy_ioctl */
1570
1571 static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1572 {
1573         struct cyclades_port *info = tty->driver_data;
1574
1575 #ifdef SERIAL_DEBUG_OTHER
1576         printk("cy_set_termios %s\n", tty->name);
1577 #endif
1578
1579         if (tty->termios->c_cflag == old_termios->c_cflag)
1580                 return;
1581         config_setup(info);
1582
1583         if ((old_termios->c_cflag & CRTSCTS) &&
1584             !(tty->termios->c_cflag & CRTSCTS)) {
1585                 tty->stopped = 0;
1586                 cy_start(tty);
1587         }
1588 #ifdef tytso_patch_94Nov25_1726
1589         if (!(old_termios->c_cflag & CLOCAL) &&
1590             (tty->termios->c_cflag & CLOCAL))
1591                 wake_up_interruptible(&info->open_wait);
1592 #endif
1593 }                               /* cy_set_termios */
1594
1595 static void cy_close(struct tty_struct *tty, struct file *filp)
1596 {
1597         struct cyclades_port *info = tty->driver_data;
1598
1599 /* CP('C'); */
1600 #ifdef SERIAL_DEBUG_OTHER
1601         printk("cy_close %s\n", tty->name);
1602 #endif
1603
1604         if (!info || serial_paranoia_check(info, tty->name, "cy_close")) {
1605                 return;
1606         }
1607 #ifdef SERIAL_DEBUG_OPEN
1608         printk("cy_close %s, count = %d\n", tty->name, info->count);
1609 #endif
1610
1611         if ((tty->count == 1) && (info->count != 1)) {
1612                 /*
1613                  * Uh, oh.  tty->count is 1, which means that the tty
1614                  * structure will be freed.  Info->count should always
1615                  * be one in these conditions.  If it's greater than
1616                  * one, we've got real problems, since it means the
1617                  * serial port won't be shutdown.
1618                  */
1619                 printk("cy_close: bad serial port count; tty->count is 1, "
1620                        "info->count is %d\n", info->count);
1621                 info->count = 1;
1622         }
1623 #ifdef SERIAL_DEBUG_COUNT
1624         printk("cyc: %d: decrementing count to %d\n", __LINE__,
1625                info->count - 1);
1626 #endif
1627         if (--info->count < 0) {
1628                 printk("cy_close: bad serial port count for ttys%d: %d\n",
1629                        info->line, info->count);
1630 #ifdef SERIAL_DEBUG_COUNT
1631                 printk("cyc: %d: setting count to 0\n", __LINE__);
1632 #endif
1633                 info->count = 0;
1634         }
1635         if (info->count)
1636                 return;
1637         info->flags |= ASYNC_CLOSING;
1638         if (info->flags & ASYNC_INITIALIZED)
1639                 tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
1640         shutdown(info);
1641         cy_flush_buffer(tty);
1642         tty_ldisc_flush(tty);
1643         info->tty = NULL;
1644         if (info->blocked_open) {
1645                 if (info->close_delay) {
1646                         msleep_interruptible(jiffies_to_msecs
1647                                              (info->close_delay));
1648                 }
1649                 wake_up_interruptible(&info->open_wait);
1650         }
1651         info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
1652         wake_up_interruptible(&info->close_wait);
1653
1654 #ifdef SERIAL_DEBUG_OTHER
1655         printk("cy_close done\n");
1656 #endif
1657 }                               /* cy_close */
1658
1659 /*
1660  * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
1661  */
1662 void cy_hangup(struct tty_struct *tty)
1663 {
1664         struct cyclades_port *info = tty->driver_data;
1665
1666 #ifdef SERIAL_DEBUG_OTHER
1667         printk("cy_hangup %s\n", tty->name);    /* */
1668 #endif
1669
1670         if (serial_paranoia_check(info, tty->name, "cy_hangup"))
1671                 return;
1672
1673         shutdown(info);
1674 #if 0
1675         info->event = 0;
1676         info->count = 0;
1677 #ifdef SERIAL_DEBUG_COUNT
1678         printk("cyc: %d: setting count to 0\n", __LINE__);
1679 #endif
1680         info->tty = 0;
1681 #endif
1682         info->flags &= ~ASYNC_NORMAL_ACTIVE;
1683         wake_up_interruptible(&info->open_wait);
1684 }                               /* cy_hangup */
1685
1686 /*
1687  * ------------------------------------------------------------
1688  * cy_open() and friends
1689  * ------------------------------------------------------------
1690  */
1691
1692 static int
1693 block_til_ready(struct tty_struct *tty, struct file *filp,
1694                 struct cyclades_port *info)
1695 {
1696         DECLARE_WAITQUEUE(wait, current);
1697         unsigned long flags;
1698         int channel;
1699         int retval;
1700         volatile u_char *base_addr = (u_char *) BASE_ADDR;
1701
1702         /*
1703          * If the device is in the middle of being closed, then block
1704          * until it's done, and then try again.
1705          */
1706         if (info->flags & ASYNC_CLOSING) {
1707                 interruptible_sleep_on(&info->close_wait);
1708                 if (info->flags & ASYNC_HUP_NOTIFY) {
1709                         return -EAGAIN;
1710                 } else {
1711                         return -ERESTARTSYS;
1712                 }
1713         }
1714
1715         /*
1716          * If non-blocking mode is set, then make the check up front
1717          * and then exit.
1718          */
1719         if (filp->f_flags & O_NONBLOCK) {
1720                 info->flags |= ASYNC_NORMAL_ACTIVE;
1721                 return 0;
1722         }
1723
1724         /*
1725          * Block waiting for the carrier detect and the line to become
1726          * free (i.e., not in use by the callout).  While we are in
1727          * this loop, info->count is dropped by one, so that
1728          * cy_close() knows when to free things.  We restore it upon
1729          * exit, either normal or abnormal.
1730          */
1731         retval = 0;
1732         add_wait_queue(&info->open_wait, &wait);
1733 #ifdef SERIAL_DEBUG_OPEN
1734         printk("block_til_ready before block: %s, count = %d\n",
1735                tty->name, info->count);
1736         /**/
1737 #endif
1738             info->count--;
1739 #ifdef SERIAL_DEBUG_COUNT
1740         printk("cyc: %d: decrementing count to %d\n", __LINE__, info->count);
1741 #endif
1742         info->blocked_open++;
1743
1744         channel = info->line;
1745
1746         while (1) {
1747                 local_irq_save(flags);
1748                 base_addr[CyCAR] = (u_char) channel;
1749                 base_addr[CyMSVR1] = CyRTS;
1750 /* CP('S');CP('4'); */
1751                 base_addr[CyMSVR2] = CyDTR;
1752 #ifdef SERIAL_DEBUG_DTR
1753                 printk("cyc: %d: raising DTR\n", __LINE__);
1754                 printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
1755                        base_addr[CyMSVR2]);
1756 #endif
1757                 local_irq_restore(flags);
1758                 set_current_state(TASK_INTERRUPTIBLE);
1759                 if (tty_hung_up_p(filp)
1760                     || !(info->flags & ASYNC_INITIALIZED)) {
1761                         if (info->flags & ASYNC_HUP_NOTIFY) {
1762                                 retval = -EAGAIN;
1763                         } else {
1764                                 retval = -ERESTARTSYS;
1765                         }
1766                         break;
1767                 }
1768                 local_irq_save(flags);
1769                 base_addr[CyCAR] = (u_char) channel;
1770 /* CP('L');CP1(1 && C_CLOCAL(tty)); CP1(1 && (base_addr[CyMSVR1] & CyDCD) ); */
1771                 if (!(info->flags & ASYNC_CLOSING)
1772                     && (C_CLOCAL(tty)
1773                         || (base_addr[CyMSVR1] & CyDCD))) {
1774                         local_irq_restore(flags);
1775                         break;
1776                 }
1777                 local_irq_restore(flags);
1778                 if (signal_pending(current)) {
1779                         retval = -ERESTARTSYS;
1780                         break;
1781                 }
1782 #ifdef SERIAL_DEBUG_OPEN
1783                 printk("block_til_ready blocking: %s, count = %d\n",
1784                        tty->name, info->count);
1785                 /**/
1786 #endif
1787                 tty_unlock();
1788                 schedule();
1789                 tty_lock();
1790         }
1791         __set_current_state(TASK_RUNNING);
1792         remove_wait_queue(&info->open_wait, &wait);
1793         if (!tty_hung_up_p(filp)) {
1794                 info->count++;
1795 #ifdef SERIAL_DEBUG_COUNT
1796                 printk("cyc: %d: incrementing count to %d\n", __LINE__,
1797                        info->count);
1798 #endif
1799         }
1800         info->blocked_open--;
1801 #ifdef SERIAL_DEBUG_OPEN
1802         printk("block_til_ready after blocking: %s, count = %d\n",
1803                tty->name, info->count);
1804         /**/
1805 #endif
1806             if (retval)
1807                 return retval;
1808         info->flags |= ASYNC_NORMAL_ACTIVE;
1809         return 0;
1810 }                               /* block_til_ready */
1811
1812 /*
1813  * This routine is called whenever a serial port is opened.  It
1814  * performs the serial-specific initialization for the tty structure.
1815  */
1816 int cy_open(struct tty_struct *tty, struct file *filp)
1817 {
1818         struct cyclades_port *info;
1819         int retval, line;
1820
1821 /* CP('O'); */
1822         line = tty->index;
1823         if ((line < 0) || (NR_PORTS <= line)) {
1824                 return -ENODEV;
1825         }
1826         info = &cy_port[line];
1827         if (info->line < 0) {
1828                 return -ENODEV;
1829         }
1830 #ifdef SERIAL_DEBUG_OTHER
1831         printk("cy_open %s\n", tty->name);      /* */
1832 #endif
1833         if (serial_paranoia_check(info, tty->name, "cy_open")) {
1834                 return -ENODEV;
1835         }
1836 #ifdef SERIAL_DEBUG_OPEN
1837         printk("cy_open %s, count = %d\n", tty->name, info->count);
1838         /**/
1839 #endif
1840             info->count++;
1841 #ifdef SERIAL_DEBUG_COUNT
1842         printk("cyc: %d: incrementing count to %d\n", __LINE__, info->count);
1843 #endif
1844         tty->driver_data = info;
1845         info->tty = tty;
1846
1847         /*
1848          * Start up serial port
1849          */
1850         retval = startup(info);
1851         if (retval) {
1852                 return retval;
1853         }
1854
1855         retval = block_til_ready(tty, filp, info);
1856         if (retval) {
1857 #ifdef SERIAL_DEBUG_OPEN
1858                 printk("cy_open returning after block_til_ready with %d\n",
1859                        retval);
1860 #endif
1861                 return retval;
1862         }
1863 #ifdef SERIAL_DEBUG_OPEN
1864         printk("cy_open done\n");
1865         /**/
1866 #endif
1867             return 0;
1868 }                               /* cy_open */
1869
1870 /*
1871  * ---------------------------------------------------------------------
1872  * serial167_init() and friends
1873  *
1874  * serial167_init() is called at boot-time to initialize the serial driver.
1875  * ---------------------------------------------------------------------
1876  */
1877
1878 /*
1879  * This routine prints out the appropriate serial driver version
1880  * number, and identifies which options were configured into this
1881  * driver.
1882  */
1883 static void show_version(void)
1884 {
1885         printk("MVME166/167 cd2401 driver\n");
1886 }                               /* show_version */
1887
1888 /* initialize chips on card -- return number of valid
1889    chips (which is number of ports/4) */
1890
1891 /*
1892  * This initialises the hardware to a reasonable state.  It should
1893  * probe the chip first so as to copy 166-Bug setup as a default for
1894  * port 0.  It initialises CMR to CyASYNC; that is never done again, so
1895  * as to limit the number of CyINIT_CHAN commands in normal running.
1896  *
1897  * ... I wonder what I should do if this fails ...
1898  */
1899
1900 void mvme167_serial_console_setup(int cflag)
1901 {
1902         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
1903         int ch;
1904         u_char spd;
1905         u_char rcor, rbpr, badspeed = 0;
1906         unsigned long flags;
1907
1908         local_irq_save(flags);
1909
1910         /*
1911          * First probe channel zero of the chip, to see what speed has
1912          * been selected.
1913          */
1914
1915         base_addr[CyCAR] = 0;
1916
1917         rcor = base_addr[CyRCOR] << 5;
1918         rbpr = base_addr[CyRBPR];
1919
1920         for (spd = 0; spd < sizeof(baud_bpr); spd++)
1921                 if (rbpr == baud_bpr[spd] && rcor == baud_co[spd])
1922                         break;
1923         if (spd >= sizeof(baud_bpr)) {
1924                 spd = 14;       /* 19200 */
1925                 badspeed = 1;   /* Failed to identify speed */
1926         }
1927         initial_console_speed = spd;
1928
1929         /* OK, we have chosen a speed, now reset and reinitialise */
1930
1931         my_udelay(20000L);      /* Allow time for any active o/p to complete */
1932         if (base_addr[CyCCR] != 0x00) {
1933                 local_irq_restore(flags);
1934                 /* printk(" chip is never idle (CCR != 0)\n"); */
1935                 return;
1936         }
1937
1938         base_addr[CyCCR] = CyCHIP_RESET;        /* Reset the chip */
1939         my_udelay(1000L);
1940
1941         if (base_addr[CyGFRCR] == 0x00) {
1942                 local_irq_restore(flags);
1943                 /* printk(" chip is not responding (GFRCR stayed 0)\n"); */
1944                 return;
1945         }
1946
1947         /*
1948          * System clock is 20Mhz, divided by 2048, so divide by 10 for a 1.0ms
1949          * tick
1950          */
1951
1952         base_addr[CyTPR] = 10;
1953
1954         base_addr[CyPILR1] = 0x01;      /* Interrupt level for modem change */
1955         base_addr[CyPILR2] = 0x02;      /* Interrupt level for tx ints */
1956         base_addr[CyPILR3] = 0x03;      /* Interrupt level for rx ints */
1957
1958         /*
1959          * Attempt to set up all channels to something reasonable, and
1960          * bang out a INIT_CHAN command.  We should then be able to limit
1961          * the amount of fiddling we have to do in normal running.
1962          */
1963
1964         for (ch = 3; ch >= 0; ch--) {
1965                 base_addr[CyCAR] = (u_char) ch;
1966                 base_addr[CyIER] = 0;
1967                 base_addr[CyCMR] = CyASYNC;
1968                 base_addr[CyLICR] = (u_char) ch << 2;
1969                 base_addr[CyLIVR] = 0x5c;
1970                 base_addr[CyTCOR] = baud_co[spd];
1971                 base_addr[CyTBPR] = baud_bpr[spd];
1972                 base_addr[CyRCOR] = baud_co[spd] >> 5;
1973                 base_addr[CyRBPR] = baud_bpr[spd];
1974                 base_addr[CySCHR1] = 'Q' & 0x1f;
1975                 base_addr[CySCHR2] = 'X' & 0x1f;
1976                 base_addr[CySCRL] = 0;
1977                 base_addr[CySCRH] = 0;
1978                 base_addr[CyCOR1] = Cy_8_BITS | CyPARITY_NONE;
1979                 base_addr[CyCOR2] = 0;
1980                 base_addr[CyCOR3] = Cy_1_STOP;
1981                 base_addr[CyCOR4] = baud_cor4[spd];
1982                 base_addr[CyCOR5] = 0;
1983                 base_addr[CyCOR6] = 0;
1984                 base_addr[CyCOR7] = 0;
1985                 base_addr[CyRTPRL] = 2;
1986                 base_addr[CyRTPRH] = 0;
1987                 base_addr[CyMSVR1] = 0;
1988                 base_addr[CyMSVR2] = 0;
1989                 write_cy_cmd(base_addr, CyINIT_CHAN | CyDIS_RCVR | CyDIS_XMTR);
1990         }
1991
1992         /*
1993          * Now do specials for channel zero....
1994          */
1995
1996         base_addr[CyMSVR1] = CyRTS;
1997         base_addr[CyMSVR2] = CyDTR;
1998         base_addr[CyIER] = CyRxData;
1999         write_cy_cmd(base_addr, CyENB_RCVR | CyENB_XMTR);
2000
2001         local_irq_restore(flags);
2002
2003         my_udelay(20000L);      /* Let it all settle down */
2004
2005         printk("CD2401 initialised,  chip is rev 0x%02x\n", base_addr[CyGFRCR]);
2006         if (badspeed)
2007                 printk
2008                     ("  WARNING:  Failed to identify line speed, rcor=%02x,rbpr=%02x\n",
2009                      rcor >> 5, rbpr);
2010 }                               /* serial_console_init */
2011
2012 static const struct tty_operations cy_ops = {
2013         .open = cy_open,
2014         .close = cy_close,
2015         .write = cy_write,
2016         .put_char = cy_put_char,
2017         .flush_chars = cy_flush_chars,
2018         .write_room = cy_write_room,
2019         .chars_in_buffer = cy_chars_in_buffer,
2020         .flush_buffer = cy_flush_buffer,
2021         .ioctl = cy_ioctl,
2022         .throttle = cy_throttle,
2023         .unthrottle = cy_unthrottle,
2024         .set_termios = cy_set_termios,
2025         .stop = cy_stop,
2026         .start = cy_start,
2027         .hangup = cy_hangup,
2028         .tiocmget = cy_tiocmget,
2029         .tiocmset = cy_tiocmset,
2030 };
2031
2032 /* The serial driver boot-time initialization code!
2033     Hardware I/O ports are mapped to character special devices on a
2034     first found, first allocated manner.  That is, this code searches
2035     for Cyclom cards in the system.  As each is found, it is probed
2036     to discover how many chips (and thus how many ports) are present.
2037     These ports are mapped to the tty ports 64 and upward in monotonic
2038     fashion.  If an 8-port card is replaced with a 16-port card, the
2039     port mapping on a following card will shift.
2040
2041     This approach is different from what is used in the other serial
2042     device driver because the Cyclom is more properly a multiplexer,
2043     not just an aggregation of serial ports on one card.
2044
2045     If there are more cards with more ports than have been statically
2046     allocated above, a warning is printed and the extra ports are ignored.
2047  */
2048 static int __init serial167_init(void)
2049 {
2050         struct cyclades_port *info;
2051         int ret = 0;
2052         int good_ports = 0;
2053         int port_num = 0;
2054         int index;
2055         int DefSpeed;
2056 #ifdef notyet
2057         struct sigaction sa;
2058 #endif
2059
2060         if (!(mvme16x_config & MVME16x_CONFIG_GOT_CD2401))
2061                 return 0;
2062
2063         cy_serial_driver = alloc_tty_driver(NR_PORTS);
2064         if (!cy_serial_driver)
2065                 return -ENOMEM;
2066
2067 #if 0
2068         scrn[1] = '\0';
2069 #endif
2070
2071         show_version();
2072
2073         /* Has "console=0,9600n8" been used in bootinfo to change speed? */
2074         if (serial_console_cflag)
2075                 DefSpeed = serial_console_cflag & 0017;
2076         else {
2077                 DefSpeed = initial_console_speed;
2078                 serial_console_info = &cy_port[0];
2079                 serial_console_cflag = DefSpeed | CS8;
2080 #if 0
2081                 serial_console = 64;    /*callout_driver.minor_start */
2082 #endif
2083         }
2084
2085         /* Initialize the tty_driver structure */
2086
2087         cy_serial_driver->owner = THIS_MODULE;
2088         cy_serial_driver->name = "ttyS";
2089         cy_serial_driver->major = TTY_MAJOR;
2090         cy_serial_driver->minor_start = 64;
2091         cy_serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
2092         cy_serial_driver->subtype = SERIAL_TYPE_NORMAL;
2093         cy_serial_driver->init_termios = tty_std_termios;
2094         cy_serial_driver->init_termios.c_cflag =
2095             B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2096         cy_serial_driver->flags = TTY_DRIVER_REAL_RAW;
2097         tty_set_operations(cy_serial_driver, &cy_ops);
2098
2099         ret = tty_register_driver(cy_serial_driver);
2100         if (ret) {
2101                 printk(KERN_ERR "Couldn't register MVME166/7 serial driver\n");
2102                 put_tty_driver(cy_serial_driver);
2103                 return ret;
2104         }
2105
2106         port_num = 0;
2107         info = cy_port;
2108         for (index = 0; index < 1; index++) {
2109
2110                 good_ports = 4;
2111
2112                 if (port_num < NR_PORTS) {
2113                         while (good_ports-- && port_num < NR_PORTS) {
2114                 /*** initialize port ***/
2115                                 info->magic = CYCLADES_MAGIC;
2116                                 info->type = PORT_CIRRUS;
2117                                 info->card = index;
2118                                 info->line = port_num;
2119                                 info->flags = STD_COM_FLAGS;
2120                                 info->tty = NULL;
2121                                 info->xmit_fifo_size = 12;
2122                                 info->cor1 = CyPARITY_NONE | Cy_8_BITS;
2123                                 info->cor2 = CyETC;
2124                                 info->cor3 = Cy_1_STOP;
2125                                 info->cor4 = 0x08;      /* _very_ small receive threshold */
2126                                 info->cor5 = 0;
2127                                 info->cor6 = 0;
2128                                 info->cor7 = 0;
2129                                 info->tbpr = baud_bpr[DefSpeed];        /* Tx BPR */
2130                                 info->tco = baud_co[DefSpeed];  /* Tx CO */
2131                                 info->rbpr = baud_bpr[DefSpeed];        /* Rx BPR */
2132                                 info->rco = baud_co[DefSpeed] >> 5;     /* Rx CO */
2133                                 info->close_delay = 0;
2134                                 info->x_char = 0;
2135                                 info->count = 0;
2136 #ifdef SERIAL_DEBUG_COUNT
2137                                 printk("cyc: %d: setting count to 0\n",
2138                                        __LINE__);
2139 #endif
2140                                 info->blocked_open = 0;
2141                                 info->default_threshold = 0;
2142                                 info->default_timeout = 0;
2143                                 init_waitqueue_head(&info->open_wait);
2144                                 init_waitqueue_head(&info->close_wait);
2145                                 /* info->session */
2146                                 /* info->pgrp */
2147 /*** !!!!!!!! this may expose new bugs !!!!!!!!! *********/
2148                                 info->read_status_mask =
2149                                     CyTIMEOUT | CySPECHAR | CyBREAK | CyPARITY |
2150                                     CyFRAME | CyOVERRUN;
2151                                 /* info->timeout */
2152
2153                                 printk("ttyS%d ", info->line);
2154                                 port_num++;
2155                                 info++;
2156                                 if (!(port_num & 7)) {
2157                                         printk("\n               ");
2158                                 }
2159                         }
2160                 }
2161                 printk("\n");
2162         }
2163         while (port_num < NR_PORTS) {
2164                 info->line = -1;
2165                 port_num++;
2166                 info++;
2167         }
2168
2169         ret = request_irq(MVME167_IRQ_SER_ERR, cd2401_rxerr_interrupt, 0,
2170                           "cd2401_errors", cd2401_rxerr_interrupt);
2171         if (ret) {
2172                 printk(KERN_ERR "Could't get cd2401_errors IRQ");
2173                 goto cleanup_serial_driver;
2174         }
2175
2176         ret = request_irq(MVME167_IRQ_SER_MODEM, cd2401_modem_interrupt, 0,
2177                           "cd2401_modem", cd2401_modem_interrupt);
2178         if (ret) {
2179                 printk(KERN_ERR "Could't get cd2401_modem IRQ");
2180                 goto cleanup_irq_cd2401_errors;
2181         }
2182
2183         ret = request_irq(MVME167_IRQ_SER_TX, cd2401_tx_interrupt, 0,
2184                           "cd2401_txints", cd2401_tx_interrupt);
2185         if (ret) {
2186                 printk(KERN_ERR "Could't get cd2401_txints IRQ");
2187                 goto cleanup_irq_cd2401_modem;
2188         }
2189
2190         ret = request_irq(MVME167_IRQ_SER_RX, cd2401_rx_interrupt, 0,
2191                           "cd2401_rxints", cd2401_rx_interrupt);
2192         if (ret) {
2193                 printk(KERN_ERR "Could't get cd2401_rxints IRQ");
2194                 goto cleanup_irq_cd2401_txints;
2195         }
2196
2197         /* Now we have registered the interrupt handlers, allow the interrupts */
2198
2199         pcc2chip[PccSCCMICR] = 0x15;    /* Serial ints are level 5 */
2200         pcc2chip[PccSCCTICR] = 0x15;
2201         pcc2chip[PccSCCRICR] = 0x15;
2202
2203         pcc2chip[PccIMLR] = 3;  /* Allow PCC2 ints above 3!? */
2204
2205         return 0;
2206 cleanup_irq_cd2401_txints:
2207         free_irq(MVME167_IRQ_SER_TX, cd2401_tx_interrupt);
2208 cleanup_irq_cd2401_modem:
2209         free_irq(MVME167_IRQ_SER_MODEM, cd2401_modem_interrupt);
2210 cleanup_irq_cd2401_errors:
2211         free_irq(MVME167_IRQ_SER_ERR, cd2401_rxerr_interrupt);
2212 cleanup_serial_driver:
2213         if (tty_unregister_driver(cy_serial_driver))
2214                 printk(KERN_ERR
2215                        "Couldn't unregister MVME166/7 serial driver\n");
2216         put_tty_driver(cy_serial_driver);
2217         return ret;
2218 }                               /* serial167_init */
2219
2220 module_init(serial167_init);
2221
2222 #ifdef CYCLOM_SHOW_STATUS
2223 static void show_status(int line_num)
2224 {
2225         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
2226         int channel;
2227         struct cyclades_port *info;
2228         unsigned long flags;
2229
2230         info = &cy_port[line_num];
2231         channel = info->line;
2232         printk("  channel %d\n", channel);
2233         /**/ printk(" cy_port\n");
2234         printk("  card line flags = %d %d %x\n",
2235                info->card, info->line, info->flags);
2236         printk
2237             ("  *tty read_status_mask timeout xmit_fifo_size = %lx %x %x %x\n",
2238              (long)info->tty, info->read_status_mask, info->timeout,
2239              info->xmit_fifo_size);
2240         printk("  cor1,cor2,cor3,cor4,cor5,cor6,cor7 = %x %x %x %x %x %x %x\n",
2241                info->cor1, info->cor2, info->cor3, info->cor4, info->cor5,
2242                info->cor6, info->cor7);
2243         printk("  tbpr,tco,rbpr,rco = %d %d %d %d\n", info->tbpr, info->tco,
2244                info->rbpr, info->rco);
2245         printk("  close_delay event count = %d %d %d\n", info->close_delay,
2246                info->event, info->count);
2247         printk("  x_char blocked_open = %x %x\n", info->x_char,
2248                info->blocked_open);
2249         printk("  open_wait = %lx %lx %lx\n", (long)info->open_wait);
2250
2251         local_irq_save(flags);
2252
2253 /* Global Registers */
2254
2255         printk(" CyGFRCR %x\n", base_addr[CyGFRCR]);
2256         printk(" CyCAR %x\n", base_addr[CyCAR]);
2257         printk(" CyRISR %x\n", base_addr[CyRISR]);
2258         printk(" CyTISR %x\n", base_addr[CyTISR]);
2259         printk(" CyMISR %x\n", base_addr[CyMISR]);
2260         printk(" CyRIR %x\n", base_addr[CyRIR]);
2261         printk(" CyTIR %x\n", base_addr[CyTIR]);
2262         printk(" CyMIR %x\n", base_addr[CyMIR]);
2263         printk(" CyTPR %x\n", base_addr[CyTPR]);
2264
2265         base_addr[CyCAR] = (u_char) channel;
2266
2267 /* Virtual Registers */
2268
2269 #if 0
2270         printk(" CyRIVR %x\n", base_addr[CyRIVR]);
2271         printk(" CyTIVR %x\n", base_addr[CyTIVR]);
2272         printk(" CyMIVR %x\n", base_addr[CyMIVR]);
2273         printk(" CyMISR %x\n", base_addr[CyMISR]);
2274 #endif
2275
2276 /* Channel Registers */
2277
2278         printk(" CyCCR %x\n", base_addr[CyCCR]);
2279         printk(" CyIER %x\n", base_addr[CyIER]);
2280         printk(" CyCOR1 %x\n", base_addr[CyCOR1]);
2281         printk(" CyCOR2 %x\n", base_addr[CyCOR2]);
2282         printk(" CyCOR3 %x\n", base_addr[CyCOR3]);
2283         printk(" CyCOR4 %x\n", base_addr[CyCOR4]);
2284         printk(" CyCOR5 %x\n", base_addr[CyCOR5]);
2285 #if 0
2286         printk(" CyCCSR %x\n", base_addr[CyCCSR]);
2287         printk(" CyRDCR %x\n", base_addr[CyRDCR]);
2288 #endif
2289         printk(" CySCHR1 %x\n", base_addr[CySCHR1]);
2290         printk(" CySCHR2 %x\n", base_addr[CySCHR2]);
2291 #if 0
2292         printk(" CySCHR3 %x\n", base_addr[CySCHR3]);
2293         printk(" CySCHR4 %x\n", base_addr[CySCHR4]);
2294         printk(" CySCRL %x\n", base_addr[CySCRL]);
2295         printk(" CySCRH %x\n", base_addr[CySCRH]);
2296         printk(" CyLNC %x\n", base_addr[CyLNC]);
2297         printk(" CyMCOR1 %x\n", base_addr[CyMCOR1]);
2298         printk(" CyMCOR2 %x\n", base_addr[CyMCOR2]);
2299 #endif
2300         printk(" CyRTPRL %x\n", base_addr[CyRTPRL]);
2301         printk(" CyRTPRH %x\n", base_addr[CyRTPRH]);
2302         printk(" CyMSVR1 %x\n", base_addr[CyMSVR1]);
2303         printk(" CyMSVR2 %x\n", base_addr[CyMSVR2]);
2304         printk(" CyRBPR %x\n", base_addr[CyRBPR]);
2305         printk(" CyRCOR %x\n", base_addr[CyRCOR]);
2306         printk(" CyTBPR %x\n", base_addr[CyTBPR]);
2307         printk(" CyTCOR %x\n", base_addr[CyTCOR]);
2308
2309         local_irq_restore(flags);
2310 }                               /* show_status */
2311 #endif
2312
2313 #if 0
2314 /* Dummy routine in mvme16x/config.c for now */
2315
2316 /* Serial console setup. Called from linux/init/main.c */
2317
2318 void console_setup(char *str, int *ints)
2319 {
2320         char *s;
2321         int baud, bits, parity;
2322         int cflag = 0;
2323
2324         /* Sanity check. */
2325         if (ints[0] > 3 || ints[1] > 3)
2326                 return;
2327
2328         /* Get baud, bits and parity */
2329         baud = 2400;
2330         bits = 8;
2331         parity = 'n';
2332         if (ints[2])
2333                 baud = ints[2];
2334         if ((s = strchr(str, ','))) {
2335                 do {
2336                         s++;
2337                 } while (*s >= '0' && *s <= '9');
2338                 if (*s)
2339                         parity = *s++;
2340                 if (*s)
2341                         bits = *s - '0';
2342         }
2343
2344         /* Now construct a cflag setting. */
2345         switch (baud) {
2346         case 1200:
2347                 cflag |= B1200;
2348                 break;
2349         case 9600:
2350                 cflag |= B9600;
2351                 break;
2352         case 19200:
2353                 cflag |= B19200;
2354                 break;
2355         case 38400:
2356                 cflag |= B38400;
2357                 break;
2358         case 2400:
2359         default:
2360                 cflag |= B2400;
2361                 break;
2362         }
2363         switch (bits) {
2364         case 7:
2365                 cflag |= CS7;
2366                 break;
2367         default:
2368         case 8:
2369                 cflag |= CS8;
2370                 break;
2371         }
2372         switch (parity) {
2373         case 'o':
2374         case 'O':
2375                 cflag |= PARODD;
2376                 break;
2377         case 'e':
2378         case 'E':
2379                 cflag |= PARENB;
2380                 break;
2381         }
2382
2383         serial_console_info = &cy_port[ints[1]];
2384         serial_console_cflag = cflag;
2385         serial_console = ints[1] + 64;  /*callout_driver.minor_start */
2386 }
2387 #endif
2388
2389 /*
2390  * The following is probably out of date for 2.1.x serial console stuff.
2391  *
2392  * The console is registered early on from arch/m68k/kernel/setup.c, and
2393  * it therefore relies on the chip being setup correctly by 166-Bug.  This
2394  * seems reasonable, as the serial port has been used to invoke the system
2395  * boot.  It also means that this function must not rely on any data
2396  * initialisation performed by serial167_init() etc.
2397  *
2398  * Of course, once the console has been registered, we had better ensure
2399  * that serial167_init() doesn't leave the chip non-functional.
2400  *
2401  * The console must be locked when we get here.
2402  */
2403
2404 void serial167_console_write(struct console *co, const char *str,
2405                              unsigned count)
2406 {
2407         volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
2408         unsigned long flags;
2409         volatile u_char sink;
2410         u_char ier;
2411         int port;
2412         u_char do_lf = 0;
2413         int i = 0;
2414
2415         local_irq_save(flags);
2416
2417         /* Ensure transmitter is enabled! */
2418
2419         port = 0;
2420         base_addr[CyCAR] = (u_char) port;
2421         while (base_addr[CyCCR])
2422                 ;
2423         base_addr[CyCCR] = CyENB_XMTR;
2424
2425         ier = base_addr[CyIER];
2426         base_addr[CyIER] = CyTxMpty;
2427
2428         while (1) {
2429                 if (pcc2chip[PccSCCTICR] & 0x20) {
2430                         /* We have a Tx int. Acknowledge it */
2431                         sink = pcc2chip[PccTPIACKR];
2432                         if ((base_addr[CyLICR] >> 2) == port) {
2433                                 if (i == count) {
2434                                         /* Last char of string is now output */
2435                                         base_addr[CyTEOIR] = CyNOTRANS;
2436                                         break;
2437                                 }
2438                                 if (do_lf) {
2439                                         base_addr[CyTDR] = '\n';
2440                                         str++;
2441                                         i++;
2442                                         do_lf = 0;
2443                                 } else if (*str == '\n') {
2444                                         base_addr[CyTDR] = '\r';
2445                                         do_lf = 1;
2446                                 } else {
2447                                         base_addr[CyTDR] = *str++;
2448                                         i++;
2449                                 }
2450                                 base_addr[CyTEOIR] = 0;
2451                         } else
2452                                 base_addr[CyTEOIR] = CyNOTRANS;
2453                 }
2454         }
2455
2456         base_addr[CyIER] = ier;
2457
2458         local_irq_restore(flags);
2459 }
2460
2461 static struct tty_driver *serial167_console_device(struct console *c,
2462                                                    int *index)
2463 {
2464         *index = c->index;
2465         return cy_serial_driver;
2466 }
2467
2468 static struct console sercons = {
2469         .name = "ttyS",
2470         .write = serial167_console_write,
2471         .device = serial167_console_device,
2472         .flags = CON_PRINTBUFFER,
2473         .index = -1,
2474 };
2475
2476 static int __init serial167_console_init(void)
2477 {
2478         if (vme_brdtype == VME_TYPE_MVME166 ||
2479             vme_brdtype == VME_TYPE_MVME167 ||
2480             vme_brdtype == VME_TYPE_MVME177) {
2481                 mvme167_serial_console_setup(0);
2482                 register_console(&sercons);
2483         }
2484         return 0;
2485 }
2486
2487 console_initcall(serial167_console_init);
2488
2489 MODULE_LICENSE("GPL");