summaryrefslogtreecommitdiffstats
path: root/drivers/char/dz.h
blob: bf106e1ea786c8d3a55b6cb51f50ede3a954d7ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/*
 * dz.h: Serial port driver for DECStations equiped 
 *       with the DZ chipset.
 *
 * Copyright (C) 1998 Olivier A. D. Lebaillif 
 *             
 * Email: olivier.lebaillif@ifrsys.com
 *
 */
#ifndef DZ_SERIAL_H
#define DZ_SERIAL_H

/*
 * Definitions for the Control and Status Received.
 */
#define DZ_TRDY        0x8000                 /* Transmitter empty */
#define DZ_TIE         0x4000                 /* Transmitter Interrupt Enable */
#define DZ_RDONE       0x0080                 /* Receiver data ready */
#define DZ_RIE         0x0040                 /* Receive Interrupt Enable */
#define DZ_MSE         0x0020                 /* Master Scan Enable */
#define DZ_CLR         0x0010                 /* Master reset */
#define DZ_MAINT       0x0008                 /* Loop Back Mode */

/*
 * Definitions for the Received buffer. 
 */
#define DZ_RBUF_MASK   0x00FF                 /* Data Mask in the Receive Buffer */
#define DZ_LINE_MASK   0x0300                 /* Line Mask in the Receive Buffer */
#define DZ_DVAL        0x8000                 /* Valid Data indicator */
#define DZ_OERR        0x4000                 /* Overrun error indicator */
#define DZ_FERR        0x2000                 /* Frame error indicator */
#define DZ_PERR        0x1000                 /* Parity error indicator */

#define LINE(x) (x & DZ_LINE_MASK) >> 8       /* Get the line number from the input buffer */
#define UCHAR(x) (unsigned char)(x & DZ_RBUF_MASK)

/*
 * Definitions for the Transmit Register.
 */
#define DZ_LINE_KEYBOARD 0x0001
#define DZ_LINE_MOUSE    0x0002
#define DZ_LINE_MODEM    0x0004
#define DZ_LINE_PRINTER  0x0008

#define DZ_MODEM_DTR     0x0400               /* DTR for the modem line (2) */

/*
 * Definitions for the Modem Status Register.
 */
#define DZ_MODEM_DSR     0x0200               /* DSR for the modem line (2) */

/*
 * Definitions for the Transmit Data Register.
 */
#define DZ_BRK0          0x0100               /* Break assertion for line 0 */
#define DZ_BRK1          0x0200               /* Break assertion for line 1 */
#define DZ_BRK2          0x0400               /* Break assertion for line 2 */
#define DZ_BRK3          0x0800               /* Break assertion for line 3 */

/*
 * Definitions for the Line Parameter Register.
 */
#define DZ_KEYBOARD      0x0000               /* line 0 = keyboard */
#define DZ_MOUSE         0x0001               /* line 1 = mouse */
#define DZ_MODEM         0x0002               /* line 2 = modem */
#define DZ_PRINTER       0x0003               /* line 3 = printer */

#define DZ_CSIZE         0x0018               /* Number of bits per byte (mask) */
#define DZ_CS5           0x0000               /* 5 bits per byte */
#define DZ_CS6           0x0008               /* 6 bits per byte */
#define DZ_CS7           0x0010               /* 7 bits per byte */
#define DZ_CS8           0x0018               /* 8 bits per byte */

#define DZ_CSTOPB        0x0020               /* 2 stop bits instead of one */ 

#define DZ_PARENB        0x0040               /* Parity enable */
#define DZ_PARODD        0x0080               /* Odd parity instead of even */

#define DZ_CBAUD         0x0E00               /* Baud Rate (mask) */
#define DZ_B50           0x0000
#define DZ_B75           0x0100
#define DZ_B110          0x0200
#define DZ_B134          0x0300
#define DZ_B150          0x0400
#define DZ_B300          0x0500
#define DZ_B600          0x0600
#define DZ_B1200         0x0700 
#define DZ_B1800         0x0800
#define DZ_B2000         0x0900
#define DZ_B2400         0x0A00
#define DZ_B3600         0x0B00
#define DZ_B4800         0x0C00
#define DZ_B7200         0x0D00
#define DZ_B9600         0x0E00

#define DZ_CREAD         0x1000               /* Enable receiver */
#define DZ_RXENAB        0x1000               /* enable receive char */
/*
 * Addresses for the DZ registers
 */
#define DZ_CSR       0x00            /* Control and Status Register */
#define DZ_RBUF      0x08            /* Receive Buffer */
#define DZ_LPR       0x08            /* Line Parameters Register */
#define DZ_TCR       0x10            /* Transmitter Control Register */
#define DZ_MSR       0x18            /* Modem Status Register */
#define DZ_TDR       0x18            /* Transmit Data Register */


#define DZ_NB_PORT 4

#define DZ_XMIT_SIZE   4096                 /* buffer size */
#define WAKEUP_CHARS   DZ_XMIT_SIZE/4

#define DZ_EVENT_WRITE_WAKEUP   0

#ifndef MIN
#define MIN(a,b)        ((a) < (b) ? (a) : (b))

#define DZ_INITIALIZED       0x80000000 /* Serial port was initialized */
#define DZ_CALLOUT_ACTIVE    0x40000000 /* Call out device is active */
#define DZ_NORMAL_ACTIVE     0x20000000 /* Normal device is active */
#define DZ_BOOT_AUTOCONF     0x10000000 /* Autoconfigure port on bootup */
#define DZ_CLOSING           0x08000000 /* Serial port is closing */
#define DZ_CTS_FLOW          0x04000000 /* Do CTS flow control */
#define DZ_CHECK_CD          0x02000000 /* i.e., CLOCAL */

#define DZ_CLOSING_WAIT_INF  0
#define DZ_CLOSING_WAIT_NONE 65535

#define DZ_SPLIT_TERMIOS   0x0008 /* Separate termios for dialin/callout */
#define DZ_SESSION_LOCKOUT 0x0100 /* Lock out cua opens based on session */
#define DZ_PGRP_LOCKOUT    0x0200 /* Lock out cua opens based on pgrp */

struct dz_serial {
  unsigned                port;                /* base address for the port */
  int                     type;
  int                     flags; 
  int                     baud_base;
  int                     blocked_open;
  unsigned short          close_delay;
  unsigned short          closing_wait;
  unsigned short          line;                /* port/line number */
  unsigned short          cflags;              /* line configuration flag */
  unsigned short          x_char;              /* xon/xoff character */
  unsigned short          read_status_mask;    /* mask for read condition */
  unsigned short          ignore_status_mask;  /* mask for ignore condition */
  unsigned long           event;               /* mask used in BH */
  unsigned char           *xmit_buf;           /* Transmit buffer */
  int                     xmit_head;           /* Position of the head */
  int                     xmit_tail;           /* Position of the tail */
  int                     xmit_cnt;            /* Count of the chars in the buffer */
  int                     count;               /* indicates how many times it has been opened */
  int                     magic;

  struct async_icount     icount;              /* keep track of things ... */
  struct tty_struct       *tty;                /* tty associated */
  struct tq_struct        tqueue;              /* Queue for BH */
  struct tq_struct        tqueue_hangup;
  struct termios          normal_termios;
  struct termios          callout_termios;
  wait_queue_head_t       open_wait;
  wait_queue_head_t       close_wait;

  long                    session;             /* Session of opening process */
  long                    pgrp;                /* pgrp of opening process */

  unsigned char           is_console;          /* flag indicating a serial console */
  unsigned char           is_initialized;
};

static struct dz_serial multi[DZ_NB_PORT];    /* Four serial lines in the DZ chip */
static struct dz_serial *dz_console;
static struct tty_driver serial_driver, callout_driver;

static struct tty_struct *serial_table[DZ_NB_PORT];
static struct termios *serial_termios[DZ_NB_PORT];
static struct termios *serial_termios_locked[DZ_NB_PORT];

static int serial_refcount;

/*
 * tmp_buf is used as a temporary buffer by serial_write.  We need to
 * lock it in case the copy_from_user blocks while swapping in a page,
 * and some other program tries to do a serial write at the same time.
 * Since the lock will only come under contention when the system is
 * swapping and available memory is low, it makes sense to share one
 * buffer across all the serial ports, since it significantly saves
 * memory if large numbers of serial ports are open.
 */
static unsigned char *tmp_buf;
static DECLARE_MUTEX(tmp_buf_sem);

static char *dz_name = "DECstation DZ serial driver version ";
static char *dz_version = "1.02";

static inline unsigned short dz_in (struct dz_serial *, unsigned);
static inline void dz_out (struct dz_serial *, unsigned, unsigned short);

static inline void dz_sched_event (struct dz_serial *, int);
static inline void receive_chars (struct dz_serial *);
static inline void transmit_chars (struct dz_serial *);
static inline void check_modem_status (struct dz_serial *);

static void dz_stop (struct tty_struct *);
static void dz_start (struct tty_struct *);
static void dz_interrupt (int, void *, struct pt_regs *);
static void do_serial_bh (void);
static void do_softint (void *);
static void do_serial_hangup (void *);
static void change_speed (struct dz_serial *);
static void dz_flush_chars (struct tty_struct *);
static void dz_console_print (struct console *, const char *, unsigned int);
static void dz_flush_buffer (struct tty_struct *);
static void dz_throttle (struct tty_struct *);
static void dz_unthrottle (struct tty_struct *);
static void dz_send_xchar (struct tty_struct *, char);
static void shutdown (struct dz_serial *);
static void send_break (struct dz_serial *, int);
static void dz_set_termios (struct tty_struct *, struct termios *);
static void dz_close (struct tty_struct *, struct file *);
static void dz_hangup (struct tty_struct *);
static void show_serial_version (void);

static int dz_write (struct tty_struct *, int, const unsigned char *, int);
static int dz_write_room (struct tty_struct *);
static int dz_chars_in_buffer (struct tty_struct *);
static int startup (struct dz_serial *);
static int get_serial_info (struct dz_serial *, struct serial_struct *);
static int set_serial_info (struct dz_serial *, struct serial_struct *);
static int get_lsr_info (struct dz_serial *, unsigned int *);
static int dz_ioctl (struct tty_struct *, struct file *, unsigned int, unsigned long);
static int block_til_ready (struct tty_struct *, struct file *, struct dz_serial *);
static int dz_open (struct tty_struct *, struct file *);

#ifdef MODULE
int init_module (void)
void cleanup_module (void)
#endif

#endif

#endif /* DZ_SERIAL_H */