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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [s390/] [char/] [tubio.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  IBM/3270 Driver -- Copyright (C) 2000 UTS Global LLC
3
 *
4
 *  tubio.h -- All-Purpose header file
5
 *
6
 *
7
 *
8
 *
9
 *
10
 *  Author:  Richard Hitt
11
 */
12
#include <linux/config.h>
13
 
14
#include <linux/module.h>
15
#include <linux/version.h>
16
 
17
#include <linux/major.h>
18
#ifndef IBM_TTY3270_MAJOR
19
#  define IBM_TTY3270_MAJOR 212
20
#endif /* IBM_TTY3270_MAJOR */
21
#ifndef IBM_FS3270_MAJOR
22
#  define IBM_FS3270_MAJOR 213
23
#endif /* IBM_FS3270_MAJOR */
24
 
25
 
26
#include <linux/slab.h>
27
#include <asm/irq.h>
28
#include <asm/io.h>
29
#include <asm/idals.h>
30
#include <linux/console.h>
31
#include <linux/interrupt.h>
32
#include <asm/ebcdic.h>
33
#include <asm/uaccess.h>
34
#include <linux/proc_fs.h>
35
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0))
36
#include <linux/devfs_fs_kernel.h>
37
#endif
38
 
39
#define TUB(x) (('3'<<8)|(x))
40
#define TUBICMD TUB(3)
41
#define TUBOCMD TUB(4)
42
#define TUBGETI TUB(7)
43
#define TUBGETO TUB(8)
44
#define TUBSETMOD TUB(12)
45
#define TUBGETMOD TUB(13)
46
#define TIOPOLL TUB(32)
47
#define TIOPOKE TUB(33)
48
#define TIONPOKE TUB(34)
49
#define TIOTNORM TUB(35)
50
 
51
/* Local Channel Commands */
52
#define TC_WRITE   0x01
53
#define TC_EWRITE  0x05
54
#define TC_READMOD 0x06
55
#define TC_EWRITEA 0x0d
56
#define TC_WRITESF 0x11
57
 
58
/* Buffer Control Orders */
59
#define TO_SF 0x1d
60
#define TO_SBA 0x11
61
#define TO_IC 0x13
62
#define TO_PT 0x05
63
#define TO_RA 0x3c
64
#define TO_SFE 0x29
65
#define TO_EUA 0x12
66
#define TO_MF 0x2c
67
#define TO_SA 0x28
68
 
69
/* Field Attribute Bytes */
70
#define TF_INPUT 0x40           /* Visible input */
71
#define TF_INPUTN 0x4c          /* Invisible input */
72
#define TF_INMDT 0xc1           /* Visible, Set-MDT */
73
#define TF_LOG 0x60
74
#define TF_STAT 0x60
75
 
76
/* Character Attribute Bytes */
77
#define TAT_RESET 0x00
78
#define TAT_FIELD 0xc0
79
#define TAT_EXTHI 0x41
80
#define TAT_COLOR 0x42
81
#define TAT_CHARS 0x43
82
#define TAT_TRANS 0x46
83
 
84
/* Extended-Highlighting Bytes */
85
#define TAX_RESET 0x00
86
#define TAX_BLINK 0xf1
87
#define TAX_REVER 0xf2
88
#define TAX_UNDER 0xf4
89
 
90
/* Reset value */
91
#define TAR_RESET 0x00
92
 
93
/* Color values */
94
#define TAC_RESET 0x00
95
#define TAC_BLUE 0xf1
96
#define TAC_RED 0xf2
97
#define TAC_PINK 0xf3
98
#define TAC_GREEN 0xf4
99
#define TAC_TURQ 0xf5
100
#define TAC_YELLOW 0xf6
101
#define TAC_WHITE 0xf7
102
#define TAC_DEFAULT 0x00
103
 
104
/* Write Control Characters */
105
#define TW_NONE 0x40            /* No particular action */
106
#define TW_KR 0xc2              /* Keyboard restore */
107
#define TW_PLUSALARM 0x04       /* Add this bit for alarm */
108
 
109
/* Attention-ID (AID) Characters */
110
#define TA_CLEAR 0x6d
111
#define TA_PA2 0x6e
112
#define TA_ENTER 0x7d
113
/* more to come */
114
 
115
#define MIN(a, b) ((a) < (b)? (a): (b))
116
 
117
#define TUB_BUFADR(adr, cpp) \
118
        tty3270_tub_bufadr(tubp, adr, cpp)
119
 
120
#define TUB_EBCASC(addr, nr) codepage_convert(tub_ebcasc, addr, nr)
121
#define TUB_ASCEBC(addr, nr) codepage_convert(tub_ascebc, addr, nr)
122
 
123
/*
124
 *
125
 * General global values for the tube driver
126
 *
127
 */
128
enum tubmode {
129
        TBM_LN,                 /* Line mode */
130
        TBM_FS,                 /* Fullscreen mode */
131
        TBM_FSLN                /* Line mode shelled out of fullscreen */
132
};
133
enum tubstat {              /* normal-mode status */
134
        TBS_RUNNING,            /* none of the following */
135
        TBS_MORE,               /* timed "MORE..." in status */
136
        TBS_HOLD                /* untimed "HOLDING" in status */
137
};
138
enum tubcmd {           /* normal-mode actions to do */
139
        TBC_CONOPEN,            /* Erase-write the console */
140
        TBC_OPEN,               /* Open the tty screen */
141
        TBC_UPDATE,             /* Add lines to the log, clear cmdline */
142
        TBC_UPDLOG,             /* Add lines to log */
143
        TBC_KRUPDLOG,           /* Add lines to log, reset kbd */
144
        TBC_CLEAR,              /* Build screen from scratch */
145
        TBC_CLRUPDLOG,          /* Do log & status, not cmdline */
146
        TBC_UPDSTAT,            /* Do status update only */
147
        TBC_CLRINPUT,           /* Clear input area only */
148
        TBC_UPDINPUT            /* Update input area only */
149
};
150
enum tubwhat {          /* echo what= proc actions */
151
        TW_BOGUS,               /* Nothing at all */
152
        TW_CONFIG               /* Output configuration info */
153
};
154
 
155
 
156
 
157
 
158
 
159
#define TUBMAXMINS      256
160
#define TUB_DEV MKDEV(IBM_FS3270_MAJ, 0)        /* Generic /dev/3270/tub */
161
#define _GEOM_ROWS 24
162
#define _GEOM_COLS 80
163
#define GEOM_ROWS (tubp->geom_rows)
164
#define GEOM_COLS (tubp->geom_cols)
165
#define GEOM_MAXROWS 127
166
#define GEOM_MAXCOLS 132
167
#define GEOM_INPLEN (GEOM_COLS * 2 - 20)
168
#define GEOM_MAXINPLEN (GEOM_MAXCOLS * 2 - 20)
169
#define GEOM_INPUT (GEOM_COLS * (GEOM_ROWS - 2) - 1)  /* input atr posn */
170
#define GEOM_STAT (GEOM_INPUT + 1 + GEOM_INPLEN)
171
#define GEOM_LOG   (GEOM_COLS * GEOM_ROWS - 1)   /* log atr posn */
172
#define TS_RUNNING "Linux Running     "
173
#define TS_MORE    "Linux More...     "
174
#define DEFAULT_SCROLLTIME 5
175
#define TS_HOLD    "Linux Holding     "
176
/* data length used by tty3270_set_status_area: SBA (3), SF (2), data */
177
#define TS_LENGTH (sizeof TS_RUNNING + 3 + 2)
178
 
179
typedef struct {
180
        int aid;                        /* What-to-do flags */
181
        char *string;                   /* Optional input string */
182
} aid_t;
183
#define AIDENTRY(ch, tubp)  (&((tubp)->tty_aid[(ch) & 0x3f]))
184
 
185
/* For TUBGETMOD and TUBSETMOD.  Should include. */
186
typedef struct tubiocb {
187
        short model;
188
        short line_cnt;
189
        short col_cnt;
190
        short pf_cnt;
191
        short re_cnt;
192
        short map;
193
} tubiocb_t;
194
 
195
/* Flags that go in int aid, above */
196
#define TA_CLEARKEY     0x01            /* Key does hardware CLEAR */
197
#define TA_SHORTREAD    0x02            /* Key does hardware shortread */
198
/* If both are off, key does hardware Read Modified. */
199
#define TA_DOENTER      0x04            /* Treat key like ENTER */
200
#define TA_DOSTRING     0x08            /* Use string and ENTER */
201
#define TA_DOSTRINGD    0x10            /* Display string & set MDT */
202
#define TA_CLEARLOG     0x20            /* Make key cause clear of log */
203
 
204
/*
205
 * Tube driver buffer control block
206
 */
207
typedef struct bcb_s {
208
        char    *bc_buf;                /* Pointer to buffer */
209
        int     bc_len;                 /* Length of buffer */
210
        int     bc_cnt;                 /* Count of bytes buffered */
211
        int     bc_wr;                  /* Posn to write next byte into */
212
        int     bc_rd;                  /* Posn to read next byte from */
213
} bcb_t;
214
 
215
typedef struct tub_s {
216
        int             minor;
217
        int             irq;
218
        int             irqrc;
219
        int             devno;
220
        int             geom_rows;
221
        int             geom_cols;
222
        tubiocb_t       tubiocb;
223
        int             lnopen;
224
        int             fsopen;
225
        int             icmd;
226
        int             ocmd;
227
        devstat_t       devstat;
228
        ccw1_t          rccw;
229
        ccw1_t          wccw;
230
        struct idal_buffer *wbuf;
231
        int             cswl;
232
        void            (*intv)(struct tub_s *, devstat_t *);
233
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
234
        struct wait_queue       *waitq;
235
#else
236
        wait_queue_head_t waitq;
237
#endif
238
        int             dstat;
239
        sense_t         sense;
240
        enum tubmode    mode;
241
        enum tubstat    stat;
242
        enum tubcmd     cmd;
243
        int             flags;          /* See below for values */
244
        struct tq_struct tqueue;
245
 
246
        /* Stuff for fs-driver support */
247
        pid_t           fs_pid;         /* Pid if TBM_FS */
248
 
249
 
250
        /* Stuff for tty-driver support */
251
        struct tty_struct *tty;
252
        char *tty_input;                /* tty input area */
253
        int tty_inattr;                 /* input-area field attribute */
254
#define TTY_OUTPUT_SIZE 1024
255
        bcb_t tty_bcb;                  /* Output buffer control info */
256
        int tty_oucol;                  /* Kludge */
257
        int tty_nextlogx;               /* next screen-log position */
258
        int tty_savecursor;             /* saved cursor position */
259
        int tty_scrolltime;             /* scrollforward wait time, sec */
260
        struct timer_list tty_stimer;   /* timer for scrolltime */
261
        aid_t tty_aid[64];              /* Aid descriptors */
262
        int tty_aidinit;                /* Boolean */
263
        int tty_showaidx;               /* Last aid x to set_aid */
264
        int tty_14bitadr;               /* 14-bit bufadrs okay */
265
#define MAX_TTY_ESCA 24                 /* Set-Attribute-Order array */
266
        char tty_esca[MAX_TTY_ESCA];    /* SA array */
267
        int tty_escx;                   /* Current index within it */
268
 
269
        /* For command recall --- */
270
        char *(*tty_rclbufs)[];         /* Array of ptrs to recall bufs */
271
        int tty_rclk;                   /* Size of array tty_rclbufs */
272
        int tty_rclp;                   /* Index for most-recent cmd */
273
        int tty_rclb;                   /* Index for backscrolling */
274
 
275
        /* Work area to contain the hardware write stream */
276
        char (*ttyscreen)[];            /* ptr to data stream area */
277
        int ttyscreenl;                 /* its length */
278
        ccw1_t ttyccw;
279
} tub_t;
280
 
281
/* values for flags: */
282
#define TUB_WORKING     0x0001
283
#define TUB_BHPENDING   0x0002
284
#define TUB_RDPENDING   0x0004
285
#define TUB_ALARM       0x0008
286
#define TUB_SCROLLTIMING  0x0010
287
#define TUB_ATTN        0x0020
288
#define TUB_IACTIVE     0x0040
289
#define TUB_SIZED       0x0080
290
#define TUB_EXPECT_DE   0x0100
291
#define TUB_UNSOL_DE    0x0200
292
#define TUB_OPEN_STET   0x0400          /* No screen clear on open */
293
#define TUB_UE_BUSY     0x0800
294
#define TUB_INPUT_HACK  0x1000          /* Early init of command line */
295
 
296
#ifdef CONFIG_TN3270_CONSOLE
297
/*
298
 * Extra stuff for 3270 console support
299
 */
300
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
301
#define S390_CONSOLE_DEV MKDEV(TTY_MAJOR, 64)
302
#else
303
#define S390_CONSOLE_DEV MKDEV(TTYAUX_MAJOR, 1)
304
#endif
305
extern int tub3270_con_devno;
306
extern char (*tub3270_con_output)[];
307
extern int tub3270_con_outputl;
308
extern int tub3270_con_ouwr;
309
extern int tub3270_con_oucount;
310
extern int tub3270_con_irq;
311
extern tub_t *tub3270_con_tubp;
312
extern struct tty_driver tty3270_con_driver;
313
#endif /* CONFIG_TN3270_CONSOLE */
314
 
315
extern int tubnummins;
316
extern tub_t *(*tubminors)[TUBMAXMINS];
317
extern tub_t *(*(*tubirqs)[256])[256];
318
extern unsigned char tub_ascebc[256];
319
extern unsigned char tub_ebcasc[256];
320
extern unsigned char tub_ebcgraf[64];
321
extern int tubdebug;
322
extern int fs3270_major;
323
extern int tty3270_major;
324
extern int tty3270_proc_misc;
325
extern enum tubwhat tty3270_proc_what;
326
extern struct tty_driver tty3270_driver;
327
#ifdef CONFIG_DEVFS_FS
328
extern devfs_handle_t fs3270_devfs_dir;
329
extern void fs3270_devfs_register(tub_t *);
330
extern void fs3270_devfs_unregister(tub_t *);
331
#endif
332
 
333
#ifndef spin_trylock_irqsave
334
#define spin_trylock_irqsave(lock, flags) \
335
({ \
336
        int success; \
337
        __save_flags(flags); \
338
        __cli(); \
339
        success = spin_trylock(lock); \
340
        if (success == 0) \
341
                __restore_flags(flags); \
342
        success; \
343
})
344
#endif /* if not spin_trylock_irqsave */
345
 
346
#ifndef s390irq_spin_trylock_irqsave
347
#define s390irq_spin_trylock_irqsave(irq, flags) \
348
        spin_trylock_irqsave(&(ioinfo[irq]->irq_lock), flags)
349
#endif /* if not s390irq_spin_trylock_irqsave */
350
 
351
#define TUBLOCK(irq, flags) \
352
        s390irq_spin_lock_irqsave(irq, flags)
353
 
354
#define TUBTRYLOCK(irq, flags) \
355
        s390irq_spin_trylock_irqsave(irq, flags)
356
 
357
#define TUBUNLOCK(irq, flags) \
358
        s390irq_spin_unlock_irqrestore(irq, flags)
359
 
360
/*
361
 * Find tub_t * given fullscreen device's irq (subchannel number)
362
 */
363
extern tub_t *tubfindbyirq(int);
364
#define IRQ2TUB(irq) tubfindbyirq(irq)
365
/*
366
 * Find tub_t * given fullscreen device's inode pointer
367
 * This algorithm takes into account /dev/3270/tub.
368
 */
369
static inline tub_t *INODE2TUB(struct inode *ip)
370
{
371
        unsigned int minor = MINOR(ip->i_rdev);
372
        tub_t *tubp = NULL;
373
        if (minor == 0 && current->tty != NULL) {
374
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
375
#ifdef CONFIG_TN3270_CONSOLE
376
                if (tub3270_con_tubp != NULL &&
377
                    current->tty->device == S390_CONSOLE_DEV)
378
                        minor = tub3270_con_tubp->minor;
379
                else
380
#endif
381
#endif
382
                if (MAJOR(current->tty->device) == IBM_TTY3270_MAJOR)
383
                        minor = MINOR(current->tty->device);
384
        }
385
        if (minor <= tubnummins && minor > 0)
386
                tubp = (*tubminors)[minor];
387
        return tubp;
388
}
389
 
390
/*
391
 * Find tub_t * given non-fullscreen (tty) device's tty_struct pointer
392
 */
393
static inline tub_t *TTY2TUB(struct tty_struct *tty)
394
{
395
        unsigned int minor = MINOR(tty->device);
396
        tub_t *tubp = NULL;
397
 
398
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
399
#ifdef CONFIG_TN3270_CONSOLE
400
        if (tty->device == S390_CONSOLE_DEV)
401
                tubp = tub3270_con_tubp;
402
        else
403
#endif
404
#endif
405
        if (minor <= tubnummins && minor > 0)
406
                tubp = (*tubminors)[minor];
407
        return tubp;
408
}
409
 
410
extern void tub_inc_use_count(void);
411
extern void tub_dec_use_count(void);
412
extern int tub3270_movedata(bcb_t *, bcb_t *, int);
413
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
414
extern int tubmakemin(int, dev_info_t *);
415
#else
416
extern int tubmakemin(int, s390_dev_info_t *);
417
#endif
418
extern int tub3270_con_copy(tub_t *);
419
extern int tty3270_rcl_init(tub_t *);
420
extern int tty3270_rcl_set(tub_t *, char *, int);
421
extern void tty3270_rcl_fini(tub_t *);
422
extern int tty3270_rcl_get(tub_t *, char *, int, int);
423
extern void tty3270_rcl_put(tub_t *, char *, int);
424
extern void tty3270_rcl_sync(tub_t *);
425
extern void tty3270_rcl_purge(tub_t *);
426
extern int tty3270_rcl_resize(tub_t *, int);
427
extern int tty3270_size(tub_t *, long *);
428
extern int tty3270_aid_init(tub_t *);
429
extern void tty3270_aid_fini(tub_t *);
430
extern void tty3270_aid_reinit(tub_t *);
431
extern int tty3270_aid_get(tub_t *, int, int *, char **);
432
extern int tty3270_aid_set(tub_t *, char *, int);
433
extern int tty3270_build(tub_t *);
434
extern void tty3270_scl_settimer(tub_t *);
435
extern void tty3270_scl_resettimer(tub_t *);
436
extern int tty3270_scl_set(tub_t *, char *, int);
437
extern int tty3270_scl_init(tub_t *tubp);
438
extern void tty3270_scl_fini(tub_t *tubp);

powered by: WebSVN 2.1.0

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