OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [char/] [amiserial.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.