[PATCH] tty: switch to ktermios
[safe/jmp/linux-2.6] / drivers / s390 / char / sclp_tty.c
1 /*
2  *  drivers/s390/char/sclp_tty.c
3  *    SCLP line mode terminal driver.
4  *
5  *  S390 version
6  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7  *    Author(s): Martin Peschke <mpeschke@de.ibm.com>
8  *               Martin Schwidefsky <schwidefsky@de.ibm.com>
9  */
10
11 #include <linux/module.h>
12 #include <linux/kmod.h>
13 #include <linux/tty.h>
14 #include <linux/tty_driver.h>
15 #include <linux/tty_flip.h>
16 #include <linux/sched.h>
17 #include <linux/wait.h>
18 #include <linux/slab.h>
19 #include <linux/err.h>
20 #include <linux/init.h>
21 #include <linux/interrupt.h>
22 #include <asm/uaccess.h>
23
24 #include "ctrlchar.h"
25 #include "sclp.h"
26 #include "sclp_rw.h"
27 #include "sclp_tty.h"
28
29 #define SCLP_TTY_PRINT_HEADER "sclp tty driver: "
30
31 /*
32  * size of a buffer that collects single characters coming in
33  * via sclp_tty_put_char()
34  */
35 #define SCLP_TTY_BUF_SIZE 512
36
37 /*
38  * There is exactly one SCLP terminal, so we can keep things simple
39  * and allocate all variables statically.
40  */
41
42 /* Lock to guard over changes to global variables. */
43 static spinlock_t sclp_tty_lock;
44 /* List of free pages that can be used for console output buffering. */
45 static struct list_head sclp_tty_pages;
46 /* List of full struct sclp_buffer structures ready for output. */
47 static struct list_head sclp_tty_outqueue;
48 /* Counter how many buffers are emitted. */
49 static int sclp_tty_buffer_count;
50 /* Pointer to current console buffer. */
51 static struct sclp_buffer *sclp_ttybuf;
52 /* Timer for delayed output of console messages. */
53 static struct timer_list sclp_tty_timer;
54 /* Waitqueue to wait for buffers to get empty. */
55 static wait_queue_head_t sclp_tty_waitq;
56
57 static struct tty_struct *sclp_tty;
58 static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE];
59 static unsigned short int sclp_tty_chars_count;
60
61 struct tty_driver *sclp_tty_driver;
62
63 static struct sclp_ioctls sclp_ioctls;
64 static struct sclp_ioctls sclp_ioctls_init =
65 {
66         8,                      /* 1 hor. tab. = 8 spaces */
67         0,                      /* no echo of input by this driver */
68         80,                     /* 80 characters/line */
69         1,                      /* write after 1/10 s without final new line */
70         MAX_KMEM_PAGES,         /* quick fix: avoid __alloc_pages */
71         MAX_KMEM_PAGES,         /* take 32/64 pages from kernel memory, */
72         0,                      /* do not convert to lower case */
73         0x6c                    /* to seprate upper and lower case */
74                                 /* ('%' in EBCDIC) */
75 };
76
77 /* This routine is called whenever we try to open a SCLP terminal. */
78 static int
79 sclp_tty_open(struct tty_struct *tty, struct file *filp)
80 {
81         sclp_tty = tty;
82         tty->driver_data = NULL;
83         tty->low_latency = 0;
84         return 0;
85 }
86
87 /* This routine is called when the SCLP terminal is closed. */
88 static void
89 sclp_tty_close(struct tty_struct *tty, struct file *filp)
90 {
91         if (tty->count > 1)
92                 return;
93         sclp_tty = NULL;
94 }
95
96 /* execute commands to control the i/o behaviour of the SCLP tty at runtime */
97 static int
98 sclp_tty_ioctl(struct tty_struct *tty, struct file * file,
99                unsigned int cmd, unsigned long arg)
100 {
101         unsigned long flags;
102         unsigned int obuf;
103         int check;
104         int rc;
105
106         if (tty->flags & (1 << TTY_IO_ERROR))
107                 return -EIO;
108         rc = 0;
109         check = 0;
110         switch (cmd) {
111         case TIOCSCLPSHTAB:
112                 /* set width of horizontal tab  */
113                 if (get_user(sclp_ioctls.htab, (unsigned short __user *) arg))
114                         rc = -EFAULT;
115                 else
116                         check = 1;
117                 break;
118         case TIOCSCLPGHTAB:
119                 /* get width of horizontal tab  */
120                 if (put_user(sclp_ioctls.htab, (unsigned short __user *) arg))
121                         rc = -EFAULT;
122                 break;
123         case TIOCSCLPSECHO:
124                 /* enable/disable echo of input */
125                 if (get_user(sclp_ioctls.echo, (unsigned char __user *) arg))
126                         rc = -EFAULT;
127                 break;
128         case TIOCSCLPGECHO:
129                 /* Is echo of input enabled ?  */
130                 if (put_user(sclp_ioctls.echo, (unsigned char __user *) arg))
131                         rc = -EFAULT;
132                 break;
133         case TIOCSCLPSCOLS:
134                 /* set number of columns for output  */
135                 if (get_user(sclp_ioctls.columns, (unsigned short __user *) arg))
136                         rc = -EFAULT;
137                 else
138                         check = 1;
139                 break;
140         case TIOCSCLPGCOLS:
141                 /* get number of columns for output  */
142                 if (put_user(sclp_ioctls.columns, (unsigned short __user *) arg))
143                         rc = -EFAULT;
144                 break;
145         case TIOCSCLPSNL:
146                 /* enable/disable writing without final new line character  */
147                 if (get_user(sclp_ioctls.final_nl, (signed char __user *) arg))
148                         rc = -EFAULT;
149                 break;
150         case TIOCSCLPGNL:
151                 /* Is writing without final new line character enabled ?  */
152                 if (put_user(sclp_ioctls.final_nl, (signed char __user *) arg))
153                         rc = -EFAULT;
154                 break;
155         case TIOCSCLPSOBUF:
156                 /*
157                  * set the maximum buffers size for output, will be rounded
158                  * up to next 4kB boundary and stored as number of SCCBs
159                  * (4kB Buffers) limitation: 256 x 4kB
160                  */
161                 if (get_user(obuf, (unsigned int __user *) arg) == 0) {
162                         if (obuf & 0xFFF)
163                                 sclp_ioctls.max_sccb = (obuf >> 12) + 1;
164                         else
165                                 sclp_ioctls.max_sccb = (obuf >> 12);
166                 } else
167                         rc = -EFAULT;
168                 break;
169         case TIOCSCLPGOBUF:
170                 /* get the maximum buffers size for output  */
171                 obuf = sclp_ioctls.max_sccb << 12;
172                 if (put_user(obuf, (unsigned int __user *) arg))
173                         rc = -EFAULT;
174                 break;
175         case TIOCSCLPGKBUF:
176                 /* get the number of buffers got from kernel at startup */
177                 if (put_user(sclp_ioctls.kmem_sccb, (unsigned short __user *) arg))
178                         rc = -EFAULT;
179                 break;
180         case TIOCSCLPSCASE:
181                 /* enable/disable conversion from upper to lower case */
182                 if (get_user(sclp_ioctls.tolower, (unsigned char __user *) arg))
183                         rc = -EFAULT;
184                 break;
185         case TIOCSCLPGCASE:
186                 /* Is conversion from upper to lower case of input enabled? */
187                 if (put_user(sclp_ioctls.tolower, (unsigned char __user *) arg))
188                         rc = -EFAULT;
189                 break;
190         case TIOCSCLPSDELIM:
191                 /*
192                  * set special character used for separating upper and
193                  * lower case, 0x00 disables this feature
194                  */
195                 if (get_user(sclp_ioctls.delim, (unsigned char __user *) arg))
196                         rc = -EFAULT;
197                 break;
198         case TIOCSCLPGDELIM:
199                 /*
200                  * get special character used for separating upper and
201                  * lower case, 0x00 disables this feature
202                  */
203                 if (put_user(sclp_ioctls.delim, (unsigned char __user *) arg))
204                         rc = -EFAULT;
205                 break;
206         case TIOCSCLPSINIT:
207                 /* set initial (default) sclp ioctls  */
208                 sclp_ioctls = sclp_ioctls_init;
209                 check = 1;
210                 break;
211         default:
212                 rc = -ENOIOCTLCMD;
213                 break;
214         }
215         if (check) {
216                 spin_lock_irqsave(&sclp_tty_lock, flags);
217                 if (sclp_ttybuf != NULL) {
218                         sclp_set_htab(sclp_ttybuf, sclp_ioctls.htab);
219                         sclp_set_columns(sclp_ttybuf, sclp_ioctls.columns);
220                 }
221                 spin_unlock_irqrestore(&sclp_tty_lock, flags);
222         }
223         return rc;
224 }
225
226 /*
227  * This routine returns the numbers of characters the tty driver
228  * will accept for queuing to be written.  This number is subject
229  * to change as output buffers get emptied, or if the output flow
230  * control is acted. This is not an exact number because not every
231  * character needs the same space in the sccb. The worst case is
232  * a string of newlines. Every newlines creates a new mto which
233  * needs 8 bytes.
234  */
235 static int
236 sclp_tty_write_room (struct tty_struct *tty)
237 {
238         unsigned long flags;
239         struct list_head *l;
240         int count;
241
242         spin_lock_irqsave(&sclp_tty_lock, flags);
243         count = 0;
244         if (sclp_ttybuf != NULL)
245                 count = sclp_buffer_space(sclp_ttybuf) / sizeof(struct mto);
246         list_for_each(l, &sclp_tty_pages)
247                 count += NR_EMPTY_MTO_PER_SCCB;
248         spin_unlock_irqrestore(&sclp_tty_lock, flags);
249         return count;
250 }
251
252 static void
253 sclp_ttybuf_callback(struct sclp_buffer *buffer, int rc)
254 {
255         unsigned long flags;
256         void *page;
257
258         do {
259                 page = sclp_unmake_buffer(buffer);
260                 spin_lock_irqsave(&sclp_tty_lock, flags);
261                 /* Remove buffer from outqueue */
262                 list_del(&buffer->list);
263                 sclp_tty_buffer_count--;
264                 list_add_tail((struct list_head *) page, &sclp_tty_pages);
265                 /* Check if there is a pending buffer on the out queue. */
266                 buffer = NULL;
267                 if (!list_empty(&sclp_tty_outqueue))
268                         buffer = list_entry(sclp_tty_outqueue.next,
269                                             struct sclp_buffer, list);
270                 spin_unlock_irqrestore(&sclp_tty_lock, flags);
271         } while (buffer && sclp_emit_buffer(buffer, sclp_ttybuf_callback));
272         wake_up(&sclp_tty_waitq);
273         /* check if the tty needs a wake up call */
274         if (sclp_tty != NULL) {
275                 tty_wakeup(sclp_tty);
276         }
277 }
278
279 static inline void
280 __sclp_ttybuf_emit(struct sclp_buffer *buffer)
281 {
282         unsigned long flags;
283         int count;
284         int rc;
285
286         spin_lock_irqsave(&sclp_tty_lock, flags);
287         list_add_tail(&buffer->list, &sclp_tty_outqueue);
288         count = sclp_tty_buffer_count++;
289         spin_unlock_irqrestore(&sclp_tty_lock, flags);
290         if (count)
291                 return;
292         rc = sclp_emit_buffer(buffer, sclp_ttybuf_callback);
293         if (rc)
294                 sclp_ttybuf_callback(buffer, rc);
295 }
296
297 /*
298  * When this routine is called from the timer then we flush the
299  * temporary write buffer.
300  */
301 static void
302 sclp_tty_timeout(unsigned long data)
303 {
304         unsigned long flags;
305         struct sclp_buffer *buf;
306
307         spin_lock_irqsave(&sclp_tty_lock, flags);
308         buf = sclp_ttybuf;
309         sclp_ttybuf = NULL;
310         spin_unlock_irqrestore(&sclp_tty_lock, flags);
311
312         if (buf != NULL) {
313                 __sclp_ttybuf_emit(buf);
314         }
315 }
316
317 /*
318  * Write a string to the sclp tty.
319  */
320 static void
321 sclp_tty_write_string(const unsigned char *str, int count)
322 {
323         unsigned long flags;
324         void *page;
325         int written;
326         struct sclp_buffer *buf;
327
328         if (count <= 0)
329                 return;
330         spin_lock_irqsave(&sclp_tty_lock, flags);
331         do {
332                 /* Create a sclp output buffer if none exists yet */
333                 if (sclp_ttybuf == NULL) {
334                         while (list_empty(&sclp_tty_pages)) {
335                                 spin_unlock_irqrestore(&sclp_tty_lock, flags);
336                                 if (in_interrupt())
337                                         sclp_sync_wait();
338                                 else
339                                         wait_event(sclp_tty_waitq,
340                                                 !list_empty(&sclp_tty_pages));
341                                 spin_lock_irqsave(&sclp_tty_lock, flags);
342                         }
343                         page = sclp_tty_pages.next;
344                         list_del((struct list_head *) page);
345                         sclp_ttybuf = sclp_make_buffer(page,
346                                                        sclp_ioctls.columns,
347                                                        sclp_ioctls.htab);
348                 }
349                 /* try to write the string to the current output buffer */
350                 written = sclp_write(sclp_ttybuf, str, count);
351                 if (written == count)
352                         break;
353                 /*
354                  * Not all characters could be written to the current
355                  * output buffer. Emit the buffer, create a new buffer
356                  * and then output the rest of the string.
357                  */
358                 buf = sclp_ttybuf;
359                 sclp_ttybuf = NULL;
360                 spin_unlock_irqrestore(&sclp_tty_lock, flags);
361                 __sclp_ttybuf_emit(buf);
362                 spin_lock_irqsave(&sclp_tty_lock, flags);
363                 str += written;
364                 count -= written;
365         } while (count > 0);
366         /* Setup timer to output current console buffer after 1/10 second */
367         if (sclp_ioctls.final_nl) {
368                 if (sclp_ttybuf != NULL &&
369                     sclp_chars_in_buffer(sclp_ttybuf) != 0 &&
370                     !timer_pending(&sclp_tty_timer)) {
371                         init_timer(&sclp_tty_timer);
372                         sclp_tty_timer.function = sclp_tty_timeout;
373                         sclp_tty_timer.data = 0UL;
374                         sclp_tty_timer.expires = jiffies + HZ/10;
375                         add_timer(&sclp_tty_timer);
376                 }
377         } else {
378                 if (sclp_ttybuf != NULL &&
379                     sclp_chars_in_buffer(sclp_ttybuf) != 0) {
380                         buf = sclp_ttybuf;
381                         sclp_ttybuf = NULL;
382                         spin_unlock_irqrestore(&sclp_tty_lock, flags);
383                         __sclp_ttybuf_emit(buf);
384                         spin_lock_irqsave(&sclp_tty_lock, flags);
385                 }
386         }
387         spin_unlock_irqrestore(&sclp_tty_lock, flags);
388 }
389
390 /*
391  * This routine is called by the kernel to write a series of characters to the
392  * tty device. The characters may come from user space or kernel space. This
393  * routine will return the number of characters actually accepted for writing.
394  */
395 static int
396 sclp_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
397 {
398         if (sclp_tty_chars_count > 0) {
399                 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count);
400                 sclp_tty_chars_count = 0;
401         }
402         sclp_tty_write_string(buf, count);
403         return count;
404 }
405
406 /*
407  * This routine is called by the kernel to write a single character to the tty
408  * device. If the kernel uses this routine, it must call the flush_chars()
409  * routine (if defined) when it is done stuffing characters into the driver.
410  *
411  * Characters provided to sclp_tty_put_char() are buffered by the SCLP driver.
412  * If the given character is a '\n' the contents of the SCLP write buffer
413  * - including previous characters from sclp_tty_put_char() and strings from
414  * sclp_write() without final '\n' - will be written.
415  */
416 static void
417 sclp_tty_put_char(struct tty_struct *tty, unsigned char ch)
418 {
419         sclp_tty_chars[sclp_tty_chars_count++] = ch;
420         if (ch == '\n' || sclp_tty_chars_count >= SCLP_TTY_BUF_SIZE) {
421                 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count);
422                 sclp_tty_chars_count = 0;
423         }
424 }
425
426 /*
427  * This routine is called by the kernel after it has written a series of
428  * characters to the tty device using put_char().
429  */
430 static void
431 sclp_tty_flush_chars(struct tty_struct *tty)
432 {
433         if (sclp_tty_chars_count > 0) {
434                 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count);
435                 sclp_tty_chars_count = 0;
436         }
437 }
438
439 /*
440  * This routine returns the number of characters in the write buffer of the
441  * SCLP driver. The provided number includes all characters that are stored
442  * in the SCCB (will be written next time the SCLP is not busy) as well as
443  * characters in the write buffer (will not be written as long as there is a
444  * final line feed missing).
445  */
446 static int
447 sclp_tty_chars_in_buffer(struct tty_struct *tty)
448 {
449         unsigned long flags;
450         struct list_head *l;
451         struct sclp_buffer *t;
452         int count;
453
454         spin_lock_irqsave(&sclp_tty_lock, flags);
455         count = 0;
456         if (sclp_ttybuf != NULL)
457                 count = sclp_chars_in_buffer(sclp_ttybuf);
458         list_for_each(l, &sclp_tty_outqueue) {
459                 t = list_entry(l, struct sclp_buffer, list);
460                 count += sclp_chars_in_buffer(t);
461         }
462         spin_unlock_irqrestore(&sclp_tty_lock, flags);
463         return count;
464 }
465
466 /*
467  * removes all content from buffers of low level driver
468  */
469 static void
470 sclp_tty_flush_buffer(struct tty_struct *tty)
471 {
472         if (sclp_tty_chars_count > 0) {
473                 sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count);
474                 sclp_tty_chars_count = 0;
475         }
476 }
477
478 /*
479  * push input to tty
480  */
481 static void
482 sclp_tty_input(unsigned char* buf, unsigned int count)
483 {
484         unsigned int cchar;
485
486         /*
487          * If this tty driver is currently closed
488          * then throw the received input away.
489          */
490         if (sclp_tty == NULL)
491                 return;
492         cchar = ctrlchar_handle(buf, count, sclp_tty);
493         switch (cchar & CTRLCHAR_MASK) {
494         case CTRLCHAR_SYSRQ:
495                 break;
496         case CTRLCHAR_CTRL:
497                 tty_insert_flip_char(sclp_tty, cchar, TTY_NORMAL);
498                 tty_flip_buffer_push(sclp_tty);
499                 break;
500         case CTRLCHAR_NONE:
501                 /* send (normal) input to line discipline */
502                 if (count < 2 ||
503                     (strncmp((const char *) buf + count - 2, "^n", 2) &&
504                      strncmp((const char *) buf + count - 2, "\252n", 2))) {
505                         /* add the auto \n */
506                         tty_insert_flip_string(sclp_tty, buf, count);
507                         tty_insert_flip_char(sclp_tty, '\n', TTY_NORMAL);
508                 } else
509                         tty_insert_flip_string(sclp_tty, buf, count - 2);
510                 tty_flip_buffer_push(sclp_tty);
511                 break;
512         }
513 }
514
515 /*
516  * get a EBCDIC string in upper/lower case,
517  * find out characters in lower/upper case separated by a special character,
518  * modifiy original string,
519  * returns length of resulting string
520  */
521 static int
522 sclp_switch_cases(unsigned char *buf, int count,
523                   unsigned char delim, int tolower)
524 {
525         unsigned char *ip, *op;
526         int toggle;
527
528         /* initially changing case is off */
529         toggle = 0;
530         ip = op = buf;
531         while (count-- > 0) {
532                 /* compare with special character */
533                 if (*ip == delim) {
534                         /* followed by another special character? */
535                         if (count && ip[1] == delim) {
536                                 /*
537                                  * ... then put a single copy of the special
538                                  * character to the output string
539                                  */
540                                 *op++ = *ip++;
541                                 count--;
542                         } else
543                                 /*
544                                  * ... special character follower by a normal
545                                  * character toggles the case change behaviour
546                                  */
547                                 toggle = ~toggle;
548                         /* skip special character */
549                         ip++;
550                 } else
551                         /* not the special character */
552                         if (toggle)
553                                 /* but case switching is on */
554                                 if (tolower)
555                                         /* switch to uppercase */
556                                         *op++ = _ebc_toupper[(int) *ip++];
557                                 else
558                                         /* switch to lowercase */
559                                         *op++ = _ebc_tolower[(int) *ip++];
560                         else
561                                 /* no case switching, copy the character */
562                                 *op++ = *ip++;
563         }
564         /* return length of reformatted string. */
565         return op - buf;
566 }
567
568 static void
569 sclp_get_input(unsigned char *start, unsigned char *end)
570 {
571         int count;
572
573         count = end - start;
574         /*
575          * if set in ioctl convert EBCDIC to lower case
576          * (modify original input in SCCB)
577          */
578         if (sclp_ioctls.tolower)
579                 EBC_TOLOWER(start, count);
580
581         /*
582          * if set in ioctl find out characters in lower or upper case
583          * (depends on current case) separated by a special character,
584          * works on EBCDIC
585          */
586         if (sclp_ioctls.delim)
587                 count = sclp_switch_cases(start, count,
588                                           sclp_ioctls.delim,
589                                           sclp_ioctls.tolower);
590
591         /* convert EBCDIC to ASCII (modify original input in SCCB) */
592         sclp_ebcasc_str(start, count);
593
594         /* if set in ioctl write operators input to console  */
595         if (sclp_ioctls.echo)
596                 sclp_tty_write(sclp_tty, start, count);
597
598         /* transfer input to high level driver */
599         sclp_tty_input(start, count);
600 }
601
602 static inline struct gds_vector *
603 find_gds_vector(struct gds_vector *start, struct gds_vector *end, u16 id)
604 {
605         struct gds_vector *vec;
606
607         for (vec = start; vec < end; vec = (void *) vec + vec->length)
608                 if (vec->gds_id == id)
609                         return vec;
610         return NULL;
611 }
612
613 static inline struct gds_subvector *
614 find_gds_subvector(struct gds_subvector *start,
615                    struct gds_subvector *end, u8 key)
616 {
617         struct gds_subvector *subvec;
618
619         for (subvec = start; subvec < end;
620              subvec = (void *) subvec + subvec->length)
621                 if (subvec->key == key)
622                         return subvec;
623         return NULL;
624 }
625
626 static inline void
627 sclp_eval_selfdeftextmsg(struct gds_subvector *start,
628                          struct gds_subvector *end)
629 {
630         struct gds_subvector *subvec;
631
632         subvec = start;
633         while (subvec < end) {
634                 subvec = find_gds_subvector(subvec, end, 0x30);
635                 if (!subvec)
636                         break;
637                 sclp_get_input((unsigned char *)(subvec + 1),
638                                (unsigned char *) subvec + subvec->length);
639                 subvec = (void *) subvec + subvec->length;
640         }
641 }
642
643 static inline void
644 sclp_eval_textcmd(struct gds_subvector *start,
645                   struct gds_subvector *end)
646 {
647         struct gds_subvector *subvec;
648
649         subvec = start;
650         while (subvec < end) {
651                 subvec = find_gds_subvector(subvec, end,
652                                             GDS_KEY_SelfDefTextMsg);
653                 if (!subvec)
654                         break;
655                 sclp_eval_selfdeftextmsg((struct gds_subvector *)(subvec + 1),
656                                          (void *)subvec + subvec->length);
657                 subvec = (void *) subvec + subvec->length;
658         }
659 }
660
661 static inline void
662 sclp_eval_cpmsu(struct gds_vector *start, struct gds_vector *end)
663 {
664         struct gds_vector *vec;
665
666         vec = start;
667         while (vec < end) {
668                 vec = find_gds_vector(vec, end, GDS_ID_TextCmd);
669                 if (!vec)
670                         break;
671                 sclp_eval_textcmd((struct gds_subvector *)(vec + 1),
672                                   (void *) vec + vec->length);
673                 vec = (void *) vec + vec->length;
674         }
675 }
676
677
678 static inline void
679 sclp_eval_mdsmu(struct gds_vector *start, void *end)
680 {
681         struct gds_vector *vec;
682
683         vec = find_gds_vector(start, end, GDS_ID_CPMSU);
684         if (vec)
685                 sclp_eval_cpmsu(vec + 1, (void *) vec + vec->length);
686 }
687
688 static void
689 sclp_tty_receiver(struct evbuf_header *evbuf)
690 {
691         struct gds_vector *start, *end, *vec;
692
693         start = (struct gds_vector *)(evbuf + 1);
694         end = (void *) evbuf + evbuf->length;
695         vec = find_gds_vector(start, end, GDS_ID_MDSMU);
696         if (vec)
697                 sclp_eval_mdsmu(vec + 1, (void *) vec + vec->length);
698 }
699
700 static void
701 sclp_tty_state_change(struct sclp_register *reg)
702 {
703 }
704
705 static struct sclp_register sclp_input_event =
706 {
707         .receive_mask = EvTyp_OpCmd_Mask | EvTyp_PMsgCmd_Mask,
708         .state_change_fn = sclp_tty_state_change,
709         .receiver_fn = sclp_tty_receiver
710 };
711
712 static const struct tty_operations sclp_ops = {
713         .open = sclp_tty_open,
714         .close = sclp_tty_close,
715         .write = sclp_tty_write,
716         .put_char = sclp_tty_put_char,
717         .flush_chars = sclp_tty_flush_chars,
718         .write_room = sclp_tty_write_room,
719         .chars_in_buffer = sclp_tty_chars_in_buffer,
720         .flush_buffer = sclp_tty_flush_buffer,
721         .ioctl = sclp_tty_ioctl,
722 };
723
724 int __init
725 sclp_tty_init(void)
726 {
727         struct tty_driver *driver;
728         void *page;
729         int i;
730         int rc;
731
732         if (!CONSOLE_IS_SCLP)
733                 return 0;
734         driver = alloc_tty_driver(1);
735         if (!driver)
736                 return -ENOMEM;
737
738         rc = sclp_rw_init();
739         if (rc) {
740                 printk(KERN_ERR SCLP_TTY_PRINT_HEADER
741                        "could not register tty - "
742                        "sclp_rw_init returned %d\n", rc);
743                 put_tty_driver(driver);
744                 return rc;
745         }
746         /* Allocate pages for output buffering */
747         INIT_LIST_HEAD(&sclp_tty_pages);
748         for (i = 0; i < MAX_KMEM_PAGES; i++) {
749                 page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
750                 if (page == NULL) {
751                         put_tty_driver(driver);
752                         return -ENOMEM;
753                 }
754                 list_add_tail((struct list_head *) page, &sclp_tty_pages);
755         }
756         INIT_LIST_HEAD(&sclp_tty_outqueue);
757         spin_lock_init(&sclp_tty_lock);
758         init_waitqueue_head(&sclp_tty_waitq);
759         init_timer(&sclp_tty_timer);
760         sclp_ttybuf = NULL;
761         sclp_tty_buffer_count = 0;
762         if (MACHINE_IS_VM) {
763                 /*
764                  * save 4 characters for the CPU number
765                  * written at start of each line by VM/CP
766                  */
767                 sclp_ioctls_init.columns = 76;
768                 /* case input lines to lowercase */
769                 sclp_ioctls_init.tolower = 1;
770         }
771         sclp_ioctls = sclp_ioctls_init;
772         sclp_tty_chars_count = 0;
773         sclp_tty = NULL;
774
775         rc = sclp_register(&sclp_input_event);
776         if (rc) {
777                 put_tty_driver(driver);
778                 return rc;
779         }
780
781         driver->owner = THIS_MODULE;
782         driver->driver_name = "sclp_line";
783         driver->name = "sclp_line";
784         driver->major = TTY_MAJOR;
785         driver->minor_start = 64;
786         driver->type = TTY_DRIVER_TYPE_SYSTEM;
787         driver->subtype = SYSTEM_TYPE_TTY;
788         driver->init_termios = tty_std_termios;
789         driver->init_termios.c_iflag = IGNBRK | IGNPAR;
790         driver->init_termios.c_oflag = ONLCR | XTABS;
791         driver->init_termios.c_lflag = ISIG | ECHO;
792         driver->flags = TTY_DRIVER_REAL_RAW;
793         tty_set_operations(driver, &sclp_ops);
794         rc = tty_register_driver(driver);
795         if (rc) {
796                 printk(KERN_ERR SCLP_TTY_PRINT_HEADER
797                        "could not register tty - "
798                        "tty_register_driver returned %d\n", rc);
799                 put_tty_driver(driver);
800                 return rc;
801         }
802         sclp_tty_driver = driver;
803         return 0;
804 }
805 module_init(sclp_tty_init);