root/drivers/s390/char/con3215.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. raw3215_alloc_req
  2. raw3215_free_req
  3. raw3215_mk_read_req
  4. raw3215_mk_write_req
  5. raw3215_start_io
  6. raw3215_timeout
  7. raw3215_try_io
  8. raw3215_wakeup
  9. raw3215_next_io
  10. raw3215_irq
  11. raw3215_drop_line
  12. raw3215_make_room
  13. raw3215_write
  14. raw3215_putchar
  15. raw3215_flush_buffer
  16. raw3215_startup
  17. raw3215_shutdown
  18. raw3215_alloc_info
  19. raw3215_free_info
  20. raw3215_probe
  21. raw3215_remove
  22. raw3215_set_online
  23. raw3215_set_offline
  24. raw3215_pm_stop
  25. raw3215_pm_start
  26. con3215_write
  27. con3215_device
  28. con3215_flush
  29. con3215_notify
  30. con3215_init
  31. tty3215_install
  32. tty3215_open
  33. tty3215_close
  34. tty3215_write_room
  35. tty3215_write
  36. tty3215_put_char
  37. tty3215_flush_chars
  38. tty3215_chars_in_buffer
  39. tty3215_flush_buffer
  40. tty3215_throttle
  41. tty3215_unthrottle
  42. tty3215_stop
  43. tty3215_start
  44. tty3215_init

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * 3215 line mode terminal driver.
   4  *
   5  * Copyright IBM Corp. 1999, 2009
   6  * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
   7  *
   8  * Updated:
   9  *  Aug-2000: Added tab support
  10  *            Dan Morrison, IBM Corporation <dmorriso@cse.buffalo.edu>
  11  */
  12 
  13 #include <linux/types.h>
  14 #include <linux/kdev_t.h>
  15 #include <linux/tty.h>
  16 #include <linux/tty_flip.h>
  17 #include <linux/vt_kern.h>
  18 #include <linux/init.h>
  19 #include <linux/console.h>
  20 #include <linux/interrupt.h>
  21 #include <linux/err.h>
  22 #include <linux/reboot.h>
  23 #include <linux/serial.h> /* ASYNC_* flags */
  24 #include <linux/slab.h>
  25 #include <asm/ccwdev.h>
  26 #include <asm/cio.h>
  27 #include <asm/io.h>
  28 #include <asm/ebcdic.h>
  29 #include <linux/uaccess.h>
  30 #include <asm/delay.h>
  31 #include <asm/cpcmd.h>
  32 #include <asm/setup.h>
  33 
  34 #include "ctrlchar.h"
  35 
  36 #define NR_3215             1
  37 #define NR_3215_REQ         (4*NR_3215)
  38 #define RAW3215_BUFFER_SIZE 65536     /* output buffer size */
  39 #define RAW3215_INBUF_SIZE  256       /* input buffer size */
  40 #define RAW3215_MIN_SPACE   128       /* minimum free space for wakeup */
  41 #define RAW3215_MIN_WRITE   1024      /* min. length for immediate output */
  42 #define RAW3215_MAX_BYTES   3968      /* max. bytes to write with one ssch */
  43 #define RAW3215_MAX_NEWLINE 50        /* max. lines to write with one ssch */
  44 #define RAW3215_NR_CCWS     3
  45 #define RAW3215_TIMEOUT     HZ/10     /* time for delayed output */
  46 
  47 #define RAW3215_FIXED       1         /* 3215 console device is not be freed */
  48 #define RAW3215_WORKING     4         /* set if a request is being worked on */
  49 #define RAW3215_THROTTLED   8         /* set if reading is disabled */
  50 #define RAW3215_STOPPED     16        /* set if writing is disabled */
  51 #define RAW3215_TIMER_RUNS  64        /* set if the output delay timer is on */
  52 #define RAW3215_FLUSHING    128       /* set to flush buffer (no delay) */
  53 
  54 #define TAB_STOP_SIZE       8         /* tab stop size */
  55 
  56 /*
  57  * Request types for a 3215 device
  58  */
  59 enum raw3215_type {
  60         RAW3215_FREE, RAW3215_READ, RAW3215_WRITE
  61 };
  62 
  63 /*
  64  * Request structure for a 3215 device
  65  */
  66 struct raw3215_req {
  67         enum raw3215_type type;       /* type of the request */
  68         int start, len;               /* start index & len in output buffer */
  69         int delayable;                /* indication to wait for more data */
  70         int residual;                 /* residual count for read request */
  71         struct ccw1 ccws[RAW3215_NR_CCWS]; /* space for the channel program */
  72         struct raw3215_info *info;    /* pointer to main structure */
  73         struct raw3215_req *next;     /* pointer to next request */
  74 } __attribute__ ((aligned(8)));
  75 
  76 struct raw3215_info {
  77         struct tty_port port;
  78         struct ccw_device *cdev;      /* device for tty driver */
  79         spinlock_t *lock;             /* pointer to irq lock */
  80         int flags;                    /* state flags */
  81         char *buffer;                 /* pointer to output buffer */
  82         char *inbuf;                  /* pointer to input buffer */
  83         int head;                     /* first free byte in output buffer */
  84         int count;                    /* number of bytes in output buffer */
  85         int written;                  /* number of bytes in write requests */
  86         struct raw3215_req *queued_read; /* pointer to queued read requests */
  87         struct raw3215_req *queued_write;/* pointer to queued write requests */
  88         struct tasklet_struct tlet;   /* tasklet to invoke tty_wakeup */
  89         wait_queue_head_t empty_wait; /* wait queue for flushing */
  90         struct timer_list timer;      /* timer for delayed output */
  91         int line_pos;                 /* position on the line (for tabs) */
  92         char ubuffer[80];             /* copy_from_user buffer */
  93 };
  94 
  95 /* array of 3215 devices structures */
  96 static struct raw3215_info *raw3215[NR_3215];
  97 /* spinlock to protect the raw3215 array */
  98 static DEFINE_SPINLOCK(raw3215_device_lock);
  99 /* list of free request structures */
 100 static struct raw3215_req *raw3215_freelist;
 101 /* spinlock to protect free list */
 102 static spinlock_t raw3215_freelist_lock;
 103 
 104 static struct tty_driver *tty3215_driver;
 105 
 106 /*
 107  * Get a request structure from the free list
 108  */
 109 static inline struct raw3215_req *raw3215_alloc_req(void)
 110 {
 111         struct raw3215_req *req;
 112         unsigned long flags;
 113 
 114         spin_lock_irqsave(&raw3215_freelist_lock, flags);
 115         req = raw3215_freelist;
 116         raw3215_freelist = req->next;
 117         spin_unlock_irqrestore(&raw3215_freelist_lock, flags);
 118         return req;
 119 }
 120 
 121 /*
 122  * Put a request structure back to the free list
 123  */
 124 static inline void raw3215_free_req(struct raw3215_req *req)
 125 {
 126         unsigned long flags;
 127 
 128         if (req->type == RAW3215_FREE)
 129                 return;         /* don't free a free request */
 130         req->type = RAW3215_FREE;
 131         spin_lock_irqsave(&raw3215_freelist_lock, flags);
 132         req->next = raw3215_freelist;
 133         raw3215_freelist = req;
 134         spin_unlock_irqrestore(&raw3215_freelist_lock, flags);
 135 }
 136 
 137 /*
 138  * Set up a read request that reads up to 160 byte from the 3215 device.
 139  * If there is a queued read request it is used, but that shouldn't happen
 140  * because a 3215 terminal won't accept a new read before the old one is
 141  * completed.
 142  */
 143 static void raw3215_mk_read_req(struct raw3215_info *raw)
 144 {
 145         struct raw3215_req *req;
 146         struct ccw1 *ccw;
 147 
 148         /* there can only be ONE read request at a time */
 149         req = raw->queued_read;
 150         if (req == NULL) {
 151                 /* no queued read request, use new req structure */
 152                 req = raw3215_alloc_req();
 153                 req->type = RAW3215_READ;
 154                 req->info = raw;
 155                 raw->queued_read = req;
 156         }
 157 
 158         ccw = req->ccws;
 159         ccw->cmd_code = 0x0A; /* read inquiry */
 160         ccw->flags = 0x20;    /* ignore incorrect length */
 161         ccw->count = 160;
 162         ccw->cda = (__u32) __pa(raw->inbuf);
 163 }
 164 
 165 /*
 166  * Set up a write request with the information from the main structure.
 167  * A ccw chain is created that writes as much as possible from the output
 168  * buffer to the 3215 device. If a queued write exists it is replaced by
 169  * the new, probably lengthened request.
 170  */
 171 static void raw3215_mk_write_req(struct raw3215_info *raw)
 172 {
 173         struct raw3215_req *req;
 174         struct ccw1 *ccw;
 175         int len, count, ix, lines;
 176 
 177         if (raw->count <= raw->written)
 178                 return;
 179         /* check if there is a queued write request */
 180         req = raw->queued_write;
 181         if (req == NULL) {
 182                 /* no queued write request, use new req structure */
 183                 req = raw3215_alloc_req();
 184                 req->type = RAW3215_WRITE;
 185                 req->info = raw;
 186                 raw->queued_write = req;
 187         } else {
 188                 raw->written -= req->len;
 189         }
 190 
 191         ccw = req->ccws;
 192         req->start = (raw->head - raw->count + raw->written) &
 193                      (RAW3215_BUFFER_SIZE - 1);
 194         /*
 195          * now we have to count newlines. We can at max accept
 196          * RAW3215_MAX_NEWLINE newlines in a single ssch due to
 197          * a restriction in VM
 198          */
 199         lines = 0;
 200         ix = req->start;
 201         while (lines < RAW3215_MAX_NEWLINE && ix != raw->head) {
 202                 if (raw->buffer[ix] == 0x15)
 203                         lines++;
 204                 ix = (ix + 1) & (RAW3215_BUFFER_SIZE - 1);
 205         }
 206         len = ((ix - 1 - req->start) & (RAW3215_BUFFER_SIZE - 1)) + 1;
 207         if (len > RAW3215_MAX_BYTES)
 208                 len = RAW3215_MAX_BYTES;
 209         req->len = len;
 210         raw->written += len;
 211 
 212         /* set the indication if we should try to enlarge this request */
 213         req->delayable = (ix == raw->head) && (len < RAW3215_MIN_WRITE);
 214 
 215         ix = req->start;
 216         while (len > 0) {
 217                 if (ccw > req->ccws)
 218                         ccw[-1].flags |= 0x40; /* use command chaining */
 219                 ccw->cmd_code = 0x01; /* write, auto carrier return */
 220                 ccw->flags = 0x20;    /* ignore incorrect length ind.  */
 221                 ccw->cda =
 222                         (__u32) __pa(raw->buffer + ix);
 223                 count = len;
 224                 if (ix + count > RAW3215_BUFFER_SIZE)
 225                         count = RAW3215_BUFFER_SIZE - ix;
 226                 ccw->count = count;
 227                 len -= count;
 228                 ix = (ix + count) & (RAW3215_BUFFER_SIZE - 1);
 229                 ccw++;
 230         }
 231         /*
 232          * Add a NOP to the channel program. 3215 devices are purely
 233          * emulated and its much better to avoid the channel end
 234          * interrupt in this case.
 235          */
 236         if (ccw > req->ccws)
 237                 ccw[-1].flags |= 0x40; /* use command chaining */
 238         ccw->cmd_code = 0x03; /* NOP */
 239         ccw->flags = 0;
 240         ccw->cda = 0;
 241         ccw->count = 1;
 242 }
 243 
 244 /*
 245  * Start a read or a write request
 246  */
 247 static void raw3215_start_io(struct raw3215_info *raw)
 248 {
 249         struct raw3215_req *req;
 250         int res;
 251 
 252         req = raw->queued_read;
 253         if (req != NULL &&
 254             !(raw->flags & (RAW3215_WORKING | RAW3215_THROTTLED))) {
 255                 /* dequeue request */
 256                 raw->queued_read = NULL;
 257                 res = ccw_device_start(raw->cdev, req->ccws,
 258                                        (unsigned long) req, 0, 0);
 259                 if (res != 0) {
 260                         /* do_IO failed, put request back to queue */
 261                         raw->queued_read = req;
 262                 } else {
 263                         raw->flags |= RAW3215_WORKING;
 264                 }
 265         }
 266         req = raw->queued_write;
 267         if (req != NULL &&
 268             !(raw->flags & (RAW3215_WORKING | RAW3215_STOPPED))) {
 269                 /* dequeue request */
 270                 raw->queued_write = NULL;
 271                 res = ccw_device_start(raw->cdev, req->ccws,
 272                                        (unsigned long) req, 0, 0);
 273                 if (res != 0) {
 274                         /* do_IO failed, put request back to queue */
 275                         raw->queued_write = req;
 276                 } else {
 277                         raw->flags |= RAW3215_WORKING;
 278                 }
 279         }
 280 }
 281 
 282 /*
 283  * Function to start a delayed output after RAW3215_TIMEOUT seconds
 284  */
 285 static void raw3215_timeout(struct timer_list *t)
 286 {
 287         struct raw3215_info *raw = from_timer(raw, t, timer);
 288         unsigned long flags;
 289 
 290         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 291         raw->flags &= ~RAW3215_TIMER_RUNS;
 292         if (!tty_port_suspended(&raw->port)) {
 293                 raw3215_mk_write_req(raw);
 294                 raw3215_start_io(raw);
 295                 if ((raw->queued_read || raw->queued_write) &&
 296                     !(raw->flags & RAW3215_WORKING) &&
 297                     !(raw->flags & RAW3215_TIMER_RUNS)) {
 298                         raw->timer.expires = RAW3215_TIMEOUT + jiffies;
 299                         add_timer(&raw->timer);
 300                         raw->flags |= RAW3215_TIMER_RUNS;
 301                 }
 302         }
 303         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 304 }
 305 
 306 /*
 307  * Function to conditionally start an IO. A read is started immediately,
 308  * a write is only started immediately if the flush flag is on or the
 309  * amount of data is bigger than RAW3215_MIN_WRITE. If a write is not
 310  * done immediately a timer is started with a delay of RAW3215_TIMEOUT.
 311  */
 312 static inline void raw3215_try_io(struct raw3215_info *raw)
 313 {
 314         if (!tty_port_initialized(&raw->port) || tty_port_suspended(&raw->port))
 315                 return;
 316         if (raw->queued_read != NULL)
 317                 raw3215_start_io(raw);
 318         else if (raw->queued_write != NULL) {
 319                 if ((raw->queued_write->delayable == 0) ||
 320                     (raw->flags & RAW3215_FLUSHING)) {
 321                         /* execute write requests bigger than minimum size */
 322                         raw3215_start_io(raw);
 323                 }
 324         }
 325         if ((raw->queued_read || raw->queued_write) &&
 326             !(raw->flags & RAW3215_WORKING) &&
 327             !(raw->flags & RAW3215_TIMER_RUNS)) {
 328                 raw->timer.expires = RAW3215_TIMEOUT + jiffies;
 329                 add_timer(&raw->timer);
 330                 raw->flags |= RAW3215_TIMER_RUNS;
 331         }
 332 }
 333 
 334 /*
 335  * Call tty_wakeup from tasklet context
 336  */
 337 static void raw3215_wakeup(unsigned long data)
 338 {
 339         struct raw3215_info *raw = (struct raw3215_info *) data;
 340         struct tty_struct *tty;
 341 
 342         tty = tty_port_tty_get(&raw->port);
 343         if (tty) {
 344                 tty_wakeup(tty);
 345                 tty_kref_put(tty);
 346         }
 347 }
 348 
 349 /*
 350  * Try to start the next IO and wake up processes waiting on the tty.
 351  */
 352 static void raw3215_next_io(struct raw3215_info *raw, struct tty_struct *tty)
 353 {
 354         raw3215_mk_write_req(raw);
 355         raw3215_try_io(raw);
 356         if (tty && RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE)
 357                 tasklet_schedule(&raw->tlet);
 358 }
 359 
 360 /*
 361  * Interrupt routine, called from common io layer
 362  */
 363 static void raw3215_irq(struct ccw_device *cdev, unsigned long intparm,
 364                         struct irb *irb)
 365 {
 366         struct raw3215_info *raw;
 367         struct raw3215_req *req;
 368         struct tty_struct *tty;
 369         int cstat, dstat;
 370         int count;
 371 
 372         raw = dev_get_drvdata(&cdev->dev);
 373         req = (struct raw3215_req *) intparm;
 374         tty = tty_port_tty_get(&raw->port);
 375         cstat = irb->scsw.cmd.cstat;
 376         dstat = irb->scsw.cmd.dstat;
 377         if (cstat != 0)
 378                 raw3215_next_io(raw, tty);
 379         if (dstat & 0x01) { /* we got a unit exception */
 380                 dstat &= ~0x01;  /* we can ignore it */
 381         }
 382         switch (dstat) {
 383         case 0x80:
 384                 if (cstat != 0)
 385                         break;
 386                 /* Attention interrupt, someone hit the enter key */
 387                 raw3215_mk_read_req(raw);
 388                 raw3215_next_io(raw, tty);
 389                 break;
 390         case 0x08:
 391         case 0x0C:
 392                 /* Channel end interrupt. */
 393                 if ((raw = req->info) == NULL)
 394                         goto put_tty;        /* That shouldn't happen ... */
 395                 if (req->type == RAW3215_READ) {
 396                         /* store residual count, then wait for device end */
 397                         req->residual = irb->scsw.cmd.count;
 398                 }
 399                 if (dstat == 0x08)
 400                         break;
 401                 /* else, fall through */
 402         case 0x04:
 403                 /* Device end interrupt. */
 404                 if ((raw = req->info) == NULL)
 405                         goto put_tty;        /* That shouldn't happen ... */
 406                 if (req->type == RAW3215_READ && tty != NULL) {
 407                         unsigned int cchar;
 408 
 409                         count = 160 - req->residual;
 410                         EBCASC(raw->inbuf, count);
 411                         cchar = ctrlchar_handle(raw->inbuf, count, tty);
 412                         switch (cchar & CTRLCHAR_MASK) {
 413                         case CTRLCHAR_SYSRQ:
 414                                 break;
 415 
 416                         case CTRLCHAR_CTRL:
 417                                 tty_insert_flip_char(&raw->port, cchar,
 418                                                 TTY_NORMAL);
 419                                 tty_flip_buffer_push(&raw->port);
 420                                 break;
 421 
 422                         case CTRLCHAR_NONE:
 423                                 if (count < 2 ||
 424                                     (strncmp(raw->inbuf+count-2, "\252n", 2) &&
 425                                      strncmp(raw->inbuf+count-2, "^n", 2)) ) {
 426                                         /* add the auto \n */
 427                                         raw->inbuf[count] = '\n';
 428                                         count++;
 429                                 } else
 430                                         count -= 2;
 431                                 tty_insert_flip_string(&raw->port, raw->inbuf,
 432                                                 count);
 433                                 tty_flip_buffer_push(&raw->port);
 434                                 break;
 435                         }
 436                 } else if (req->type == RAW3215_WRITE) {
 437                         raw->count -= req->len;
 438                         raw->written -= req->len;
 439                 }
 440                 raw->flags &= ~RAW3215_WORKING;
 441                 raw3215_free_req(req);
 442                 /* check for empty wait */
 443                 if (waitqueue_active(&raw->empty_wait) &&
 444                     raw->queued_write == NULL &&
 445                     raw->queued_read == NULL) {
 446                         wake_up_interruptible(&raw->empty_wait);
 447                 }
 448                 raw3215_next_io(raw, tty);
 449                 break;
 450         default:
 451                 /* Strange interrupt, I'll do my best to clean up */
 452                 if (req != NULL && req->type != RAW3215_FREE) {
 453                         if (req->type == RAW3215_WRITE) {
 454                                 raw->count -= req->len;
 455                                 raw->written -= req->len;
 456                         }
 457                         raw->flags &= ~RAW3215_WORKING;
 458                         raw3215_free_req(req);
 459                 }
 460                 raw3215_next_io(raw, tty);
 461         }
 462 put_tty:
 463         tty_kref_put(tty);
 464 }
 465 
 466 /*
 467  * Drop the oldest line from the output buffer.
 468  */
 469 static void raw3215_drop_line(struct raw3215_info *raw)
 470 {
 471         int ix;
 472         char ch;
 473 
 474         BUG_ON(raw->written != 0);
 475         ix = (raw->head - raw->count) & (RAW3215_BUFFER_SIZE - 1);
 476         while (raw->count > 0) {
 477                 ch = raw->buffer[ix];
 478                 ix = (ix + 1) & (RAW3215_BUFFER_SIZE - 1);
 479                 raw->count--;
 480                 if (ch == 0x15)
 481                         break;
 482         }
 483         raw->head = ix;
 484 }
 485 
 486 /*
 487  * Wait until length bytes are available int the output buffer.
 488  * Has to be called with the s390irq lock held. Can be called
 489  * disabled.
 490  */
 491 static void raw3215_make_room(struct raw3215_info *raw, unsigned int length)
 492 {
 493         while (RAW3215_BUFFER_SIZE - raw->count < length) {
 494                 /* While console is frozen for suspend we have no other
 495                  * choice but to drop message from the buffer to make
 496                  * room for even more messages. */
 497                 if (tty_port_suspended(&raw->port)) {
 498                         raw3215_drop_line(raw);
 499                         continue;
 500                 }
 501                 /* there might be a request pending */
 502                 raw->flags |= RAW3215_FLUSHING;
 503                 raw3215_mk_write_req(raw);
 504                 raw3215_try_io(raw);
 505                 raw->flags &= ~RAW3215_FLUSHING;
 506 #ifdef CONFIG_TN3215_CONSOLE
 507                 ccw_device_wait_idle(raw->cdev);
 508 #endif
 509                 /* Enough room freed up ? */
 510                 if (RAW3215_BUFFER_SIZE - raw->count >= length)
 511                         break;
 512                 /* there might be another cpu waiting for the lock */
 513                 spin_unlock(get_ccwdev_lock(raw->cdev));
 514                 udelay(100);
 515                 spin_lock(get_ccwdev_lock(raw->cdev));
 516         }
 517 }
 518 
 519 /*
 520  * String write routine for 3215 devices
 521  */
 522 static void raw3215_write(struct raw3215_info *raw, const char *str,
 523                           unsigned int length)
 524 {
 525         unsigned long flags;
 526         int c, count;
 527 
 528         while (length > 0) {
 529                 spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 530                 count = (length > RAW3215_BUFFER_SIZE) ?
 531                                              RAW3215_BUFFER_SIZE : length;
 532                 length -= count;
 533 
 534                 raw3215_make_room(raw, count);
 535 
 536                 /* copy string to output buffer and convert it to EBCDIC */
 537                 while (1) {
 538                         c = min_t(int, count,
 539                                   min(RAW3215_BUFFER_SIZE - raw->count,
 540                                       RAW3215_BUFFER_SIZE - raw->head));
 541                         if (c <= 0)
 542                                 break;
 543                         memcpy(raw->buffer + raw->head, str, c);
 544                         ASCEBC(raw->buffer + raw->head, c);
 545                         raw->head = (raw->head + c) & (RAW3215_BUFFER_SIZE - 1);
 546                         raw->count += c;
 547                         raw->line_pos += c;
 548                         str += c;
 549                         count -= c;
 550                 }
 551                 if (!(raw->flags & RAW3215_WORKING)) {
 552                         raw3215_mk_write_req(raw);
 553                         /* start or queue request */
 554                         raw3215_try_io(raw);
 555                 }
 556                 spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 557         }
 558 }
 559 
 560 /*
 561  * Put character routine for 3215 devices
 562  */
 563 static void raw3215_putchar(struct raw3215_info *raw, unsigned char ch)
 564 {
 565         unsigned long flags;
 566         unsigned int length, i;
 567 
 568         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 569         if (ch == '\t') {
 570                 length = TAB_STOP_SIZE - (raw->line_pos%TAB_STOP_SIZE);
 571                 raw->line_pos += length;
 572                 ch = ' ';
 573         } else if (ch == '\n') {
 574                 length = 1;
 575                 raw->line_pos = 0;
 576         } else {
 577                 length = 1;
 578                 raw->line_pos++;
 579         }
 580         raw3215_make_room(raw, length);
 581 
 582         for (i = 0; i < length; i++) {
 583                 raw->buffer[raw->head] = (char) _ascebc[(int) ch];
 584                 raw->head = (raw->head + 1) & (RAW3215_BUFFER_SIZE - 1);
 585                 raw->count++;
 586         }
 587         if (!(raw->flags & RAW3215_WORKING)) {
 588                 raw3215_mk_write_req(raw);
 589                 /* start or queue request */
 590                 raw3215_try_io(raw);
 591         }
 592         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 593 }
 594 
 595 /*
 596  * Flush routine, it simply sets the flush flag and tries to start
 597  * pending IO.
 598  */
 599 static void raw3215_flush_buffer(struct raw3215_info *raw)
 600 {
 601         unsigned long flags;
 602 
 603         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 604         if (raw->count > 0) {
 605                 raw->flags |= RAW3215_FLUSHING;
 606                 raw3215_try_io(raw);
 607                 raw->flags &= ~RAW3215_FLUSHING;
 608         }
 609         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 610 }
 611 
 612 /*
 613  * Fire up a 3215 device.
 614  */
 615 static int raw3215_startup(struct raw3215_info *raw)
 616 {
 617         unsigned long flags;
 618 
 619         if (tty_port_initialized(&raw->port))
 620                 return 0;
 621         raw->line_pos = 0;
 622         tty_port_set_initialized(&raw->port, 1);
 623         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 624         raw3215_try_io(raw);
 625         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 626 
 627         return 0;
 628 }
 629 
 630 /*
 631  * Shutdown a 3215 device.
 632  */
 633 static void raw3215_shutdown(struct raw3215_info *raw)
 634 {
 635         DECLARE_WAITQUEUE(wait, current);
 636         unsigned long flags;
 637 
 638         if (!tty_port_initialized(&raw->port) || (raw->flags & RAW3215_FIXED))
 639                 return;
 640         /* Wait for outstanding requests, then free irq */
 641         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 642         if ((raw->flags & RAW3215_WORKING) ||
 643             raw->queued_write != NULL ||
 644             raw->queued_read != NULL) {
 645                 add_wait_queue(&raw->empty_wait, &wait);
 646                 set_current_state(TASK_INTERRUPTIBLE);
 647                 spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 648                 schedule();
 649                 spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 650                 remove_wait_queue(&raw->empty_wait, &wait);
 651                 set_current_state(TASK_RUNNING);
 652                 tty_port_set_initialized(&raw->port, 1);
 653         }
 654         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 655 }
 656 
 657 static struct raw3215_info *raw3215_alloc_info(void)
 658 {
 659         struct raw3215_info *info;
 660 
 661         info = kzalloc(sizeof(struct raw3215_info), GFP_KERNEL | GFP_DMA);
 662         if (!info)
 663                 return NULL;
 664 
 665         info->buffer = kzalloc(RAW3215_BUFFER_SIZE, GFP_KERNEL | GFP_DMA);
 666         info->inbuf = kzalloc(RAW3215_INBUF_SIZE, GFP_KERNEL | GFP_DMA);
 667         if (!info->buffer || !info->inbuf) {
 668                 kfree(info->inbuf);
 669                 kfree(info->buffer);
 670                 kfree(info);
 671                 return NULL;
 672         }
 673 
 674         timer_setup(&info->timer, raw3215_timeout, 0);
 675         init_waitqueue_head(&info->empty_wait);
 676         tasklet_init(&info->tlet, raw3215_wakeup, (unsigned long)info);
 677         tty_port_init(&info->port);
 678 
 679         return info;
 680 }
 681 
 682 static void raw3215_free_info(struct raw3215_info *raw)
 683 {
 684         kfree(raw->inbuf);
 685         kfree(raw->buffer);
 686         tty_port_destroy(&raw->port);
 687         kfree(raw);
 688 }
 689 
 690 static int raw3215_probe (struct ccw_device *cdev)
 691 {
 692         struct raw3215_info *raw;
 693         int line;
 694 
 695         /* Console is special. */
 696         if (raw3215[0] && (raw3215[0] == dev_get_drvdata(&cdev->dev)))
 697                 return 0;
 698 
 699         raw = raw3215_alloc_info();
 700         if (raw == NULL)
 701                 return -ENOMEM;
 702 
 703         raw->cdev = cdev;
 704         dev_set_drvdata(&cdev->dev, raw);
 705         cdev->handler = raw3215_irq;
 706 
 707         spin_lock(&raw3215_device_lock);
 708         for (line = 0; line < NR_3215; line++) {
 709                 if (!raw3215[line]) {
 710                         raw3215[line] = raw;
 711                         break;
 712                 }
 713         }
 714         spin_unlock(&raw3215_device_lock);
 715         if (line == NR_3215) {
 716                 raw3215_free_info(raw);
 717                 return -ENODEV;
 718         }
 719 
 720         return 0;
 721 }
 722 
 723 static void raw3215_remove (struct ccw_device *cdev)
 724 {
 725         struct raw3215_info *raw;
 726         unsigned int line;
 727 
 728         ccw_device_set_offline(cdev);
 729         raw = dev_get_drvdata(&cdev->dev);
 730         if (raw) {
 731                 spin_lock(&raw3215_device_lock);
 732                 for (line = 0; line < NR_3215; line++)
 733                         if (raw3215[line] == raw)
 734                                 break;
 735                 raw3215[line] = NULL;
 736                 spin_unlock(&raw3215_device_lock);
 737                 dev_set_drvdata(&cdev->dev, NULL);
 738                 raw3215_free_info(raw);
 739         }
 740 }
 741 
 742 static int raw3215_set_online (struct ccw_device *cdev)
 743 {
 744         struct raw3215_info *raw;
 745 
 746         raw = dev_get_drvdata(&cdev->dev);
 747         if (!raw)
 748                 return -ENODEV;
 749 
 750         return raw3215_startup(raw);
 751 }
 752 
 753 static int raw3215_set_offline (struct ccw_device *cdev)
 754 {
 755         struct raw3215_info *raw;
 756 
 757         raw = dev_get_drvdata(&cdev->dev);
 758         if (!raw)
 759                 return -ENODEV;
 760 
 761         raw3215_shutdown(raw);
 762 
 763         return 0;
 764 }
 765 
 766 static int raw3215_pm_stop(struct ccw_device *cdev)
 767 {
 768         struct raw3215_info *raw;
 769         unsigned long flags;
 770 
 771         /* Empty the output buffer, then prevent new I/O. */
 772         raw = dev_get_drvdata(&cdev->dev);
 773         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 774         raw3215_make_room(raw, RAW3215_BUFFER_SIZE);
 775         tty_port_set_suspended(&raw->port, 1);
 776         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 777         return 0;
 778 }
 779 
 780 static int raw3215_pm_start(struct ccw_device *cdev)
 781 {
 782         struct raw3215_info *raw;
 783         unsigned long flags;
 784 
 785         /* Allow I/O again and flush output buffer. */
 786         raw = dev_get_drvdata(&cdev->dev);
 787         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 788         tty_port_set_suspended(&raw->port, 0);
 789         raw->flags |= RAW3215_FLUSHING;
 790         raw3215_try_io(raw);
 791         raw->flags &= ~RAW3215_FLUSHING;
 792         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 793         return 0;
 794 }
 795 
 796 static struct ccw_device_id raw3215_id[] = {
 797         { CCW_DEVICE(0x3215, 0) },
 798         { /* end of list */ },
 799 };
 800 
 801 static struct ccw_driver raw3215_ccw_driver = {
 802         .driver = {
 803                 .name   = "3215",
 804                 .owner  = THIS_MODULE,
 805         },
 806         .ids            = raw3215_id,
 807         .probe          = &raw3215_probe,
 808         .remove         = &raw3215_remove,
 809         .set_online     = &raw3215_set_online,
 810         .set_offline    = &raw3215_set_offline,
 811         .freeze         = &raw3215_pm_stop,
 812         .thaw           = &raw3215_pm_start,
 813         .restore        = &raw3215_pm_start,
 814         .int_class      = IRQIO_C15,
 815 };
 816 
 817 #ifdef CONFIG_TN3215_CONSOLE
 818 /*
 819  * Write a string to the 3215 console
 820  */
 821 static void con3215_write(struct console *co, const char *str,
 822                           unsigned int count)
 823 {
 824         struct raw3215_info *raw;
 825         int i;
 826 
 827         if (count <= 0)
 828                 return;
 829         raw = raw3215[0];       /* console 3215 is the first one */
 830         while (count > 0) {
 831                 for (i = 0; i < count; i++)
 832                         if (str[i] == '\t' || str[i] == '\n')
 833                                 break;
 834                 raw3215_write(raw, str, i);
 835                 count -= i;
 836                 str += i;
 837                 if (count > 0) {
 838                         raw3215_putchar(raw, *str);
 839                         count--;
 840                         str++;
 841                 }
 842         }
 843 }
 844 
 845 static struct tty_driver *con3215_device(struct console *c, int *index)
 846 {
 847         *index = c->index;
 848         return tty3215_driver;
 849 }
 850 
 851 /*
 852  * panic() calls con3215_flush through a panic_notifier
 853  * before the system enters a disabled, endless loop.
 854  */
 855 static void con3215_flush(void)
 856 {
 857         struct raw3215_info *raw;
 858         unsigned long flags;
 859 
 860         raw = raw3215[0];  /* console 3215 is the first one */
 861         if (tty_port_suspended(&raw->port))
 862                 /* The console is still frozen for suspend. */
 863                 if (ccw_device_force_console(raw->cdev))
 864                         /* Forcing didn't work, no panic message .. */
 865                         return;
 866         spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
 867         raw3215_make_room(raw, RAW3215_BUFFER_SIZE);
 868         spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
 869 }
 870 
 871 static int con3215_notify(struct notifier_block *self,
 872                           unsigned long event, void *data)
 873 {
 874         con3215_flush();
 875         return NOTIFY_OK;
 876 }
 877 
 878 static struct notifier_block on_panic_nb = {
 879         .notifier_call = con3215_notify,
 880         .priority = 0,
 881 };
 882 
 883 static struct notifier_block on_reboot_nb = {
 884         .notifier_call = con3215_notify,
 885         .priority = 0,
 886 };
 887 
 888 /*
 889  *  The console structure for the 3215 console
 890  */
 891 static struct console con3215 = {
 892         .name    = "ttyS",
 893         .write   = con3215_write,
 894         .device  = con3215_device,
 895         .flags   = CON_PRINTBUFFER,
 896 };
 897 
 898 /*
 899  * 3215 console initialization code called from console_init().
 900  */
 901 static int __init con3215_init(void)
 902 {
 903         struct ccw_device *cdev;
 904         struct raw3215_info *raw;
 905         struct raw3215_req *req;
 906         int i;
 907 
 908         /* Check if 3215 is to be the console */
 909         if (!CONSOLE_IS_3215)
 910                 return -ENODEV;
 911 
 912         /* Set the console mode for VM */
 913         if (MACHINE_IS_VM) {
 914                 cpcmd("TERM CONMODE 3215", NULL, 0, NULL);
 915                 cpcmd("TERM AUTOCR OFF", NULL, 0, NULL);
 916         }
 917 
 918         /* allocate 3215 request structures */
 919         raw3215_freelist = NULL;
 920         spin_lock_init(&raw3215_freelist_lock);
 921         for (i = 0; i < NR_3215_REQ; i++) {
 922                 req = kzalloc(sizeof(struct raw3215_req), GFP_KERNEL | GFP_DMA);
 923                 if (!req)
 924                         return -ENOMEM;
 925                 req->next = raw3215_freelist;
 926                 raw3215_freelist = req;
 927         }
 928 
 929         cdev = ccw_device_create_console(&raw3215_ccw_driver);
 930         if (IS_ERR(cdev))
 931                 return -ENODEV;
 932 
 933         raw3215[0] = raw = raw3215_alloc_info();
 934         raw->cdev = cdev;
 935         dev_set_drvdata(&cdev->dev, raw);
 936         cdev->handler = raw3215_irq;
 937 
 938         raw->flags |= RAW3215_FIXED;
 939         if (ccw_device_enable_console(cdev)) {
 940                 ccw_device_destroy_console(cdev);
 941                 raw3215_free_info(raw);
 942                 raw3215[0] = NULL;
 943                 return -ENODEV;
 944         }
 945 
 946         /* Request the console irq */
 947         if (raw3215_startup(raw) != 0) {
 948                 raw3215_free_info(raw);
 949                 raw3215[0] = NULL;
 950                 return -ENODEV;
 951         }
 952         atomic_notifier_chain_register(&panic_notifier_list, &on_panic_nb);
 953         register_reboot_notifier(&on_reboot_nb);
 954         register_console(&con3215);
 955         return 0;
 956 }
 957 console_initcall(con3215_init);
 958 #endif
 959 
 960 static int tty3215_install(struct tty_driver *driver, struct tty_struct *tty)
 961 {
 962         struct raw3215_info *raw;
 963 
 964         raw = raw3215[tty->index];
 965         if (raw == NULL)
 966                 return -ENODEV;
 967 
 968         tty->driver_data = raw;
 969 
 970         return tty_port_install(&raw->port, driver, tty);
 971 }
 972 
 973 /*
 974  * tty3215_open
 975  *
 976  * This routine is called whenever a 3215 tty is opened.
 977  */
 978 static int tty3215_open(struct tty_struct *tty, struct file * filp)
 979 {
 980         struct raw3215_info *raw = tty->driver_data;
 981         int retval;
 982 
 983         tty_port_tty_set(&raw->port, tty);
 984 
 985         raw->port.low_latency = 0; /* don't use bottom half for pushing chars */
 986         /*
 987          * Start up 3215 device
 988          */
 989         retval = raw3215_startup(raw);
 990         if (retval)
 991                 return retval;
 992 
 993         return 0;
 994 }
 995 
 996 /*
 997  * tty3215_close()
 998  *
 999  * This routine is called when the 3215 tty is closed. We wait
1000  * for the remaining request to be completed. Then we clean up.
1001  */
1002 static void tty3215_close(struct tty_struct *tty, struct file * filp)
1003 {
1004         struct raw3215_info *raw;
1005 
1006         raw = (struct raw3215_info *) tty->driver_data;
1007         if (raw == NULL || tty->count > 1)
1008                 return;
1009         tty->closing = 1;
1010         /* Shutdown the terminal */
1011         raw3215_shutdown(raw);
1012         tasklet_kill(&raw->tlet);
1013         tty->closing = 0;
1014         tty_port_tty_set(&raw->port, NULL);
1015 }
1016 
1017 /*
1018  * Returns the amount of free space in the output buffer.
1019  */
1020 static int tty3215_write_room(struct tty_struct *tty)
1021 {
1022         struct raw3215_info *raw;
1023 
1024         raw = (struct raw3215_info *) tty->driver_data;
1025 
1026         /* Subtract TAB_STOP_SIZE to allow for a tab, 8 <<< 64K */
1027         if ((RAW3215_BUFFER_SIZE - raw->count - TAB_STOP_SIZE) >= 0)
1028                 return RAW3215_BUFFER_SIZE - raw->count - TAB_STOP_SIZE;
1029         else
1030                 return 0;
1031 }
1032 
1033 /*
1034  * String write routine for 3215 ttys
1035  */
1036 static int tty3215_write(struct tty_struct * tty,
1037                          const unsigned char *buf, int count)
1038 {
1039         struct raw3215_info *raw;
1040         int i, written;
1041 
1042         if (!tty)
1043                 return 0;
1044         raw = (struct raw3215_info *) tty->driver_data;
1045         written = count;
1046         while (count > 0) {
1047                 for (i = 0; i < count; i++)
1048                         if (buf[i] == '\t' || buf[i] == '\n')
1049                                 break;
1050                 raw3215_write(raw, buf, i);
1051                 count -= i;
1052                 buf += i;
1053                 if (count > 0) {
1054                         raw3215_putchar(raw, *buf);
1055                         count--;
1056                         buf++;
1057                 }
1058         }
1059         return written;
1060 }
1061 
1062 /*
1063  * Put character routine for 3215 ttys
1064  */
1065 static int tty3215_put_char(struct tty_struct *tty, unsigned char ch)
1066 {
1067         struct raw3215_info *raw;
1068 
1069         if (!tty)
1070                 return 0;
1071         raw = (struct raw3215_info *) tty->driver_data;
1072         raw3215_putchar(raw, ch);
1073         return 1;
1074 }
1075 
1076 static void tty3215_flush_chars(struct tty_struct *tty)
1077 {
1078 }
1079 
1080 /*
1081  * Returns the number of characters in the output buffer
1082  */
1083 static int tty3215_chars_in_buffer(struct tty_struct *tty)
1084 {
1085         struct raw3215_info *raw;
1086 
1087         raw = (struct raw3215_info *) tty->driver_data;
1088         return raw->count;
1089 }
1090 
1091 static void tty3215_flush_buffer(struct tty_struct *tty)
1092 {
1093         struct raw3215_info *raw;
1094 
1095         raw = (struct raw3215_info *) tty->driver_data;
1096         raw3215_flush_buffer(raw);
1097         tty_wakeup(tty);
1098 }
1099 
1100 /*
1101  * Disable reading from a 3215 tty
1102  */
1103 static void tty3215_throttle(struct tty_struct * tty)
1104 {
1105         struct raw3215_info *raw;
1106 
1107         raw = (struct raw3215_info *) tty->driver_data;
1108         raw->flags |= RAW3215_THROTTLED;
1109 }
1110 
1111 /*
1112  * Enable reading from a 3215 tty
1113  */
1114 static void tty3215_unthrottle(struct tty_struct * tty)
1115 {
1116         struct raw3215_info *raw;
1117         unsigned long flags;
1118 
1119         raw = (struct raw3215_info *) tty->driver_data;
1120         if (raw->flags & RAW3215_THROTTLED) {
1121                 spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
1122                 raw->flags &= ~RAW3215_THROTTLED;
1123                 raw3215_try_io(raw);
1124                 spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
1125         }
1126 }
1127 
1128 /*
1129  * Disable writing to a 3215 tty
1130  */
1131 static void tty3215_stop(struct tty_struct *tty)
1132 {
1133         struct raw3215_info *raw;
1134 
1135         raw = (struct raw3215_info *) tty->driver_data;
1136         raw->flags |= RAW3215_STOPPED;
1137 }
1138 
1139 /*
1140  * Enable writing to a 3215 tty
1141  */
1142 static void tty3215_start(struct tty_struct *tty)
1143 {
1144         struct raw3215_info *raw;
1145         unsigned long flags;
1146 
1147         raw = (struct raw3215_info *) tty->driver_data;
1148         if (raw->flags & RAW3215_STOPPED) {
1149                 spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags);
1150                 raw->flags &= ~RAW3215_STOPPED;
1151                 raw3215_try_io(raw);
1152                 spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags);
1153         }
1154 }
1155 
1156 static const struct tty_operations tty3215_ops = {
1157         .install = tty3215_install,
1158         .open = tty3215_open,
1159         .close = tty3215_close,
1160         .write = tty3215_write,
1161         .put_char = tty3215_put_char,
1162         .flush_chars = tty3215_flush_chars,
1163         .write_room = tty3215_write_room,
1164         .chars_in_buffer = tty3215_chars_in_buffer,
1165         .flush_buffer = tty3215_flush_buffer,
1166         .throttle = tty3215_throttle,
1167         .unthrottle = tty3215_unthrottle,
1168         .stop = tty3215_stop,
1169         .start = tty3215_start,
1170 };
1171 
1172 /*
1173  * 3215 tty registration code called from tty_init().
1174  * Most kernel services (incl. kmalloc) are available at this poimt.
1175  */
1176 static int __init tty3215_init(void)
1177 {
1178         struct tty_driver *driver;
1179         int ret;
1180 
1181         if (!CONSOLE_IS_3215)
1182                 return 0;
1183 
1184         driver = alloc_tty_driver(NR_3215);
1185         if (!driver)
1186                 return -ENOMEM;
1187 
1188         ret = ccw_driver_register(&raw3215_ccw_driver);
1189         if (ret) {
1190                 put_tty_driver(driver);
1191                 return ret;
1192         }
1193         /*
1194          * Initialize the tty_driver structure
1195          * Entries in tty3215_driver that are NOT initialized:
1196          * proc_entry, set_termios, flush_buffer, set_ldisc, write_proc
1197          */
1198 
1199         driver->driver_name = "tty3215";
1200         driver->name = "ttyS";
1201         driver->major = TTY_MAJOR;
1202         driver->minor_start = 64;
1203         driver->type = TTY_DRIVER_TYPE_SYSTEM;
1204         driver->subtype = SYSTEM_TYPE_TTY;
1205         driver->init_termios = tty_std_termios;
1206         driver->init_termios.c_iflag = IGNBRK | IGNPAR;
1207         driver->init_termios.c_oflag = ONLCR;
1208         driver->init_termios.c_lflag = ISIG;
1209         driver->flags = TTY_DRIVER_REAL_RAW;
1210         tty_set_operations(driver, &tty3215_ops);
1211         ret = tty_register_driver(driver);
1212         if (ret) {
1213                 put_tty_driver(driver);
1214                 return ret;
1215         }
1216         tty3215_driver = driver;
1217         return 0;
1218 }
1219 device_initcall(tty3215_init);

/* [<][>][^][v][top][bottom][index][help] */