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