linux/drivers/char/hvc_console.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2001 Anton Blanchard <anton@au.ibm.com>, IBM
   3 * Copyright (C) 2001 Paul Mackerras <paulus@au.ibm.com>, IBM
   4 * Copyright (C) 2004 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
   5 * Copyright (C) 2004 IBM Corporation
   6 *
   7 * Additional Author(s):
   8 *  Ryan S. Arnold <rsa@us.ibm.com>
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License as published by
  12 * the Free Software Foundation; either version 2 of the License, or
  13 * (at your option) any later version.
  14 * 
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 * 
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; if not, write to the Free Software
  22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  23 */
  24
  25#include <linux/console.h>
  26#include <linux/cpumask.h>
  27#include <linux/init.h>
  28#include <linux/kbd_kern.h>
  29#include <linux/kernel.h>
  30#include <linux/kthread.h>
  31#include <linux/list.h>
  32#include <linux/module.h>
  33#include <linux/major.h>
  34#include <linux/sysrq.h>
  35#include <linux/tty.h>
  36#include <linux/tty_flip.h>
  37#include <linux/sched.h>
  38#include <linux/spinlock.h>
  39#include <linux/delay.h>
  40#include <linux/freezer.h>
  41
  42#include <asm/uaccess.h>
  43
  44#include "hvc_console.h"
  45
  46#define HVC_MAJOR       229
  47#define HVC_MINOR       0
  48
  49/*
  50 * Wait this long per iteration while trying to push buffered data to the
  51 * hypervisor before allowing the tty to complete a close operation.
  52 */
  53#define HVC_CLOSE_WAIT (HZ/100) /* 1/10 of a second */
  54
  55/*
  56 * These sizes are most efficient for vio, because they are the
  57 * native transfer size. We could make them selectable in the
  58 * future to better deal with backends that want other buffer sizes.
  59 */
  60#define N_OUTBUF        16
  61#define N_INBUF         16
  62
  63#define __ALIGNED__ __attribute__((__aligned__(sizeof(long))))
  64
  65static struct tty_driver *hvc_driver;
  66static struct task_struct *hvc_task;
  67
  68/* Picks up late kicks after list walk but before schedule() */
  69static int hvc_kicked;
  70
  71static int hvc_init(void);
  72
  73#ifdef CONFIG_MAGIC_SYSRQ
  74static int sysrq_pressed;
  75#endif
  76
  77/* dynamic list of hvc_struct instances */
  78static LIST_HEAD(hvc_structs);
  79
  80/*
  81 * Protect the list of hvc_struct instances from inserts and removals during
  82 * list traversal.
  83 */
  84static DEFINE_SPINLOCK(hvc_structs_lock);
  85
  86/*
  87 * This value is used to assign a tty->index value to a hvc_struct based
  88 * upon order of exposure via hvc_probe(), when we can not match it to
  89 * a console candidate registered with hvc_instantiate().
  90 */
  91static int last_hvc = -1;
  92
  93/*
  94 * Do not call this function with either the hvc_structs_lock or the hvc_struct
  95 * lock held.  If successful, this function increments the kref reference
  96 * count against the target hvc_struct so it should be released when finished.
  97 */
  98static struct hvc_struct *hvc_get_by_index(int index)
  99{
 100        struct hvc_struct *hp;
 101        unsigned long flags;
 102
 103        spin_lock(&hvc_structs_lock);
 104
 105        list_for_each_entry(hp, &hvc_structs, next) {
 106                spin_lock_irqsave(&hp->lock, flags);
 107                if (hp->index == index) {
 108                        kref_get(&hp->kref);
 109                        spin_unlock_irqrestore(&hp->lock, flags);
 110                        spin_unlock(&hvc_structs_lock);
 111                        return hp;
 112                }
 113                spin_unlock_irqrestore(&hp->lock, flags);
 114        }
 115        hp = NULL;
 116
 117        spin_unlock(&hvc_structs_lock);
 118        return hp;
 119}
 120
 121
 122/*
 123 * Initial console vtermnos for console API usage prior to full console
 124 * initialization.  Any vty adapter outside this range will not have usable
 125 * console interfaces but can still be used as a tty device.  This has to be
 126 * static because kmalloc will not work during early console init.
 127 */
 128static struct hv_ops *cons_ops[MAX_NR_HVC_CONSOLES];
 129static uint32_t vtermnos[MAX_NR_HVC_CONSOLES] =
 130        {[0 ... MAX_NR_HVC_CONSOLES - 1] = -1};
 131
 132/*
 133 * Console APIs, NOT TTY.  These APIs are available immediately when
 134 * hvc_console_setup() finds adapters.
 135 */
 136
 137static void hvc_console_print(struct console *co, const char *b,
 138                              unsigned count)
 139{
 140        char c[N_OUTBUF] __ALIGNED__;
 141        unsigned i = 0, n = 0;
 142        int r, donecr = 0, index = co->index;
 143
 144        /* Console access attempt outside of acceptable console range. */
 145        if (index >= MAX_NR_HVC_CONSOLES)
 146                return;
 147
 148        /* This console adapter was removed so it is not usable. */
 149        if (vtermnos[index] < 0)
 150                return;
 151
 152        while (count > 0 || i > 0) {
 153                if (count > 0 && i < sizeof(c)) {
 154                        if (b[n] == '\n' && !donecr) {
 155                                c[i++] = '\r';
 156                                donecr = 1;
 157                        } else {
 158                                c[i++] = b[n++];
 159                                donecr = 0;
 160                                --count;
 161                        }
 162                } else {
 163                        r = cons_ops[index]->put_chars(vtermnos[index], c, i);
 164                        if (r <= 0) {
 165                                /* throw away chars on error */
 166                                i = 0;
 167                        } else if (r > 0) {
 168                                i -= r;
 169                                if (i > 0)
 170                                        memmove(c, c+r, i);
 171                        }
 172                }
 173        }
 174}
 175
 176static struct tty_driver *hvc_console_device(struct console *c, int *index)
 177{
 178        if (vtermnos[c->index] == -1)
 179                return NULL;
 180
 181        *index = c->index;
 182        return hvc_driver;
 183}
 184
 185static int __init hvc_console_setup(struct console *co, char *options)
 186{
 187        if (co->index < 0 || co->index >= MAX_NR_HVC_CONSOLES)
 188                return -ENODEV;
 189
 190        if (vtermnos[co->index] == -1)
 191                return -ENODEV;
 192
 193        return 0;
 194}
 195
 196static struct console hvc_con_driver = {
 197        .name           = "hvc",
 198        .write          = hvc_console_print,
 199        .device         = hvc_console_device,
 200        .setup          = hvc_console_setup,
 201        .flags          = CON_PRINTBUFFER,
 202        .index          = -1,
 203};
 204
 205/*
 206 * Early console initialization.  Precedes driver initialization.
 207 *
 208 * (1) we are first, and the user specified another driver
 209 * -- index will remain -1
 210 * (2) we are first and the user specified no driver
 211 * -- index will be set to 0, then we will fail setup.
 212 * (3)  we are first and the user specified our driver
 213 * -- index will be set to user specified driver, and we will fail
 214 * (4) we are after driver, and this initcall will register us
 215 * -- if the user didn't specify a driver then the console will match
 216 *
 217 * Note that for cases 2 and 3, we will match later when the io driver
 218 * calls hvc_instantiate() and call register again.
 219 */
 220static int __init hvc_console_init(void)
 221{
 222        register_console(&hvc_con_driver);
 223        return 0;
 224}
 225console_initcall(hvc_console_init);
 226
 227/* callback when the kboject ref count reaches zero. */
 228static void destroy_hvc_struct(struct kref *kref)
 229{
 230        struct hvc_struct *hp = container_of(kref, struct hvc_struct, kref);
 231        unsigned long flags;
 232
 233        spin_lock(&hvc_structs_lock);
 234
 235        spin_lock_irqsave(&hp->lock, flags);
 236        list_del(&(hp->next));
 237        spin_unlock_irqrestore(&hp->lock, flags);
 238
 239        spin_unlock(&hvc_structs_lock);
 240
 241        kfree(hp);
 242}
 243
 244/*
 245 * hvc_instantiate() is an early console discovery method which locates
 246 * consoles * prior to the vio subsystem discovering them.  Hotplugged
 247 * vty adapters do NOT get an hvc_instantiate() callback since they
 248 * appear after early console init.
 249 */
 250int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops)
 251{
 252        struct hvc_struct *hp;
 253
 254        if (index < 0 || index >= MAX_NR_HVC_CONSOLES)
 255                return -1;
 256
 257        if (vtermnos[index] != -1)
 258                return -1;
 259
 260        /* make sure no no tty has been registered in this index */
 261        hp = hvc_get_by_index(index);
 262        if (hp) {
 263                kref_put(&hp->kref, destroy_hvc_struct);
 264                return -1;
 265        }
 266
 267        vtermnos[index] = vtermno;
 268        cons_ops[index] = ops;
 269
 270        /* reserve all indices up to and including this index */
 271        if (last_hvc < index)
 272                last_hvc = index;
 273
 274        /* if this index is what the user requested, then register
 275         * now (setup won't fail at this point).  It's ok to just
 276         * call register again if previously .setup failed.
 277         */
 278        if (index == hvc_con_driver.index)
 279                register_console(&hvc_con_driver);
 280
 281        return 0;
 282}
 283EXPORT_SYMBOL_GPL(hvc_instantiate);
 284
 285/* Wake the sleeping khvcd */
 286void hvc_kick(void)
 287{
 288        hvc_kicked = 1;
 289        wake_up_process(hvc_task);
 290}
 291EXPORT_SYMBOL_GPL(hvc_kick);
 292
 293static void hvc_unthrottle(struct tty_struct *tty)
 294{
 295        hvc_kick();
 296}
 297
 298/*
 299 * The TTY interface won't be used until after the vio layer has exposed the vty
 300 * adapter to the kernel.
 301 */
 302static int hvc_open(struct tty_struct *tty, struct file * filp)
 303{
 304        struct hvc_struct *hp;
 305        unsigned long flags;
 306        int rc = 0;
 307
 308        /* Auto increments kref reference if found. */
 309        if (!(hp = hvc_get_by_index(tty->index)))
 310                return -ENODEV;
 311
 312        spin_lock_irqsave(&hp->lock, flags);
 313        /* Check and then increment for fast path open. */
 314        if (hp->count++ > 0) {
 315                spin_unlock_irqrestore(&hp->lock, flags);
 316                hvc_kick();
 317                return 0;
 318        } /* else count == 0 */
 319
 320        tty->driver_data = hp;
 321
 322        hp->tty = tty;
 323
 324        spin_unlock_irqrestore(&hp->lock, flags);
 325
 326        if (hp->ops->notifier_add)
 327                rc = hp->ops->notifier_add(hp, hp->data);
 328
 329        /*
 330         * If the notifier fails we return an error.  The tty layer
 331         * will call hvc_close() after a failed open but we don't want to clean
 332         * up there so we'll clean up here and clear out the previously set
 333         * tty fields and return the kref reference.
 334         */
 335        if (rc) {
 336                spin_lock_irqsave(&hp->lock, flags);
 337                hp->tty = NULL;
 338                spin_unlock_irqrestore(&hp->lock, flags);
 339                tty->driver_data = NULL;
 340                kref_put(&hp->kref, destroy_hvc_struct);
 341                printk(KERN_ERR "hvc_open: request_irq failed with rc %d.\n", rc);
 342        }
 343        /* Force wakeup of the polling thread */
 344        hvc_kick();
 345
 346        return rc;
 347}
 348
 349static void hvc_close(struct tty_struct *tty, struct file * filp)
 350{
 351        struct hvc_struct *hp;
 352        unsigned long flags;
 353
 354        if (tty_hung_up_p(filp))
 355                return;
 356
 357        /*
 358         * No driver_data means that this close was issued after a failed
 359         * hvc_open by the tty layer's release_dev() function and we can just
 360         * exit cleanly because the kref reference wasn't made.
 361         */
 362        if (!tty->driver_data)
 363                return;
 364
 365        hp = tty->driver_data;
 366        spin_lock_irqsave(&hp->lock, flags);
 367
 368        if (--hp->count == 0) {
 369                /* We are done with the tty pointer now. */
 370                hp->tty = NULL;
 371                spin_unlock_irqrestore(&hp->lock, flags);
 372
 373                if (hp->ops->notifier_del)
 374                        hp->ops->notifier_del(hp, hp->data);
 375
 376                /* cancel pending tty resize work */
 377                cancel_work_sync(&hp->tty_resize);
 378
 379                /*
 380                 * Chain calls chars_in_buffer() and returns immediately if
 381                 * there is no buffered data otherwise sleeps on a wait queue
 382                 * waking periodically to check chars_in_buffer().
 383                 */
 384                tty_wait_until_sent(tty, HVC_CLOSE_WAIT);
 385        } else {
 386                if (hp->count < 0)
 387                        printk(KERN_ERR "hvc_close %X: oops, count is %d\n",
 388                                hp->vtermno, hp->count);
 389                spin_unlock_irqrestore(&hp->lock, flags);
 390        }
 391
 392        kref_put(&hp->kref, destroy_hvc_struct);
 393}
 394
 395static void hvc_hangup(struct tty_struct *tty)
 396{
 397        struct hvc_struct *hp = tty->driver_data;
 398        unsigned long flags;
 399        int temp_open_count;
 400
 401        if (!hp)
 402                return;
 403
 404        /* cancel pending tty resize work */
 405        cancel_work_sync(&hp->tty_resize);
 406
 407        spin_lock_irqsave(&hp->lock, flags);
 408
 409        /*
 410         * The N_TTY line discipline has problems such that in a close vs
 411         * open->hangup case this can be called after the final close so prevent
 412         * that from happening for now.
 413         */
 414        if (hp->count <= 0) {
 415                spin_unlock_irqrestore(&hp->lock, flags);
 416                return;
 417        }
 418
 419        temp_open_count = hp->count;
 420        hp->count = 0;
 421        hp->n_outbuf = 0;
 422        hp->tty = NULL;
 423
 424        spin_unlock_irqrestore(&hp->lock, flags);
 425
 426        if (hp->ops->notifier_hangup)
 427                        hp->ops->notifier_hangup(hp, hp->data);
 428
 429        while(temp_open_count) {
 430                --temp_open_count;
 431                kref_put(&hp->kref, destroy_hvc_struct);
 432        }
 433}
 434
 435/*
 436 * Push buffered characters whether they were just recently buffered or waiting
 437 * on a blocked hypervisor.  Call this function with hp->lock held.
 438 */
 439static int hvc_push(struct hvc_struct *hp)
 440{
 441        int n;
 442
 443        n = hp->ops->put_chars(hp->vtermno, hp->outbuf, hp->n_outbuf);
 444        if (n <= 0) {
 445                if (n == 0) {
 446                        hp->do_wakeup = 1;
 447                        return 0;
 448                }
 449                /* throw away output on error; this happens when
 450                   there is no session connected to the vterm. */
 451                hp->n_outbuf = 0;
 452        } else
 453                hp->n_outbuf -= n;
 454        if (hp->n_outbuf > 0)
 455                memmove(hp->outbuf, hp->outbuf + n, hp->n_outbuf);
 456        else
 457                hp->do_wakeup = 1;
 458
 459        return n;
 460}
 461
 462static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count)
 463{
 464        struct hvc_struct *hp = tty->driver_data;
 465        unsigned long flags;
 466        int rsize, written = 0;
 467
 468        /* This write was probably executed during a tty close. */
 469        if (!hp)
 470                return -EPIPE;
 471
 472        if (hp->count <= 0)
 473                return -EIO;
 474
 475        spin_lock_irqsave(&hp->lock, flags);
 476
 477        /* Push pending writes */
 478        if (hp->n_outbuf > 0)
 479                hvc_push(hp);
 480
 481        while (count > 0 && (rsize = hp->outbuf_size - hp->n_outbuf) > 0) {
 482                if (rsize > count)
 483                        rsize = count;
 484                memcpy(hp->outbuf + hp->n_outbuf, buf, rsize);
 485                count -= rsize;
 486                buf += rsize;
 487                hp->n_outbuf += rsize;
 488                written += rsize;
 489                hvc_push(hp);
 490        }
 491        spin_unlock_irqrestore(&hp->lock, flags);
 492
 493        /*
 494         * Racy, but harmless, kick thread if there is still pending data.
 495         */
 496        if (hp->n_outbuf)
 497                hvc_kick();
 498
 499        return written;
 500}
 501
 502/**
 503 * hvc_set_winsz() - Resize the hvc tty terminal window.
 504 * @work:       work structure.
 505 *
 506 * The routine shall not be called within an atomic context because it
 507 * might sleep.
 508 *
 509 * Locking:     hp->lock
 510 */
 511static void hvc_set_winsz(struct work_struct *work)
 512{
 513        struct hvc_struct *hp;
 514        unsigned long hvc_flags;
 515        struct tty_struct *tty;
 516        struct winsize ws;
 517
 518        hp = container_of(work, struct hvc_struct, tty_resize);
 519
 520        spin_lock_irqsave(&hp->lock, hvc_flags);
 521        if (!hp->tty) {
 522                spin_unlock_irqrestore(&hp->lock, hvc_flags);
 523                return;
 524        }
 525        ws  = hp->ws;
 526        tty = tty_kref_get(hp->tty);
 527        spin_unlock_irqrestore(&hp->lock, hvc_flags);
 528
 529        tty_do_resize(tty, &ws);
 530        tty_kref_put(tty);
 531}
 532
 533/*
 534 * This is actually a contract between the driver and the tty layer outlining
 535 * how much write room the driver can guarantee will be sent OR BUFFERED.  This
 536 * driver MUST honor the return value.
 537 */
 538static int hvc_write_room(struct tty_struct *tty)
 539{
 540        struct hvc_struct *hp = tty->driver_data;
 541
 542        if (!hp)
 543                return -1;
 544
 545        return hp->outbuf_size - hp->n_outbuf;
 546}
 547
 548static int hvc_chars_in_buffer(struct tty_struct *tty)
 549{
 550        struct hvc_struct *hp = tty->driver_data;
 551
 552        if (!hp)
 553                return 0;
 554        return hp->n_outbuf;
 555}
 556
 557/*
 558 * timeout will vary between the MIN and MAX values defined here.  By default
 559 * and during console activity we will use a default MIN_TIMEOUT of 10.  When
 560 * the console is idle, we increase the timeout value on each pass through
 561 * msleep until we reach the max.  This may be noticeable as a brief (average
 562 * one second) delay on the console before the console responds to input when
 563 * there has been no input for some time.
 564 */
 565#define MIN_TIMEOUT             (10)
 566#define MAX_TIMEOUT             (2000)
 567static u32 timeout = MIN_TIMEOUT;
 568
 569#define HVC_POLL_READ   0x00000001
 570#define HVC_POLL_WRITE  0x00000002
 571
 572int hvc_poll(struct hvc_struct *hp)
 573{
 574        struct tty_struct *tty;
 575        int i, n, poll_mask = 0;
 576        char buf[N_INBUF] __ALIGNED__;
 577        unsigned long flags;
 578        int read_total = 0;
 579        int written_total = 0;
 580
 581        spin_lock_irqsave(&hp->lock, flags);
 582
 583        /* Push pending writes */
 584        if (hp->n_outbuf > 0)
 585                written_total = hvc_push(hp);
 586
 587        /* Reschedule us if still some write pending */
 588        if (hp->n_outbuf > 0) {
 589                poll_mask |= HVC_POLL_WRITE;
 590                /* If hvc_push() was not able to write, sleep a few msecs */
 591                timeout = (written_total) ? 0 : MIN_TIMEOUT;
 592        }
 593
 594        /* No tty attached, just skip */
 595        tty = hp->tty;
 596        if (tty == NULL)
 597                goto bail;
 598
 599        /* Now check if we can get data (are we throttled ?) */
 600        if (test_bit(TTY_THROTTLED, &tty->flags))
 601                goto throttled;
 602
 603        /* If we aren't notifier driven and aren't throttled, we always
 604         * request a reschedule
 605         */
 606        if (!hp->irq_requested)
 607                poll_mask |= HVC_POLL_READ;
 608
 609        /* Read data if any */
 610        for (;;) {
 611                int count = tty_buffer_request_room(tty, N_INBUF);
 612
 613                /* If flip is full, just reschedule a later read */
 614                if (count == 0) {
 615                        poll_mask |= HVC_POLL_READ;
 616                        break;
 617                }
 618
 619                n = hp->ops->get_chars(hp->vtermno, buf, count);
 620                if (n <= 0) {
 621                        /* Hangup the tty when disconnected from host */
 622                        if (n == -EPIPE) {
 623                                spin_unlock_irqrestore(&hp->lock, flags);
 624                                tty_hangup(tty);
 625                                spin_lock_irqsave(&hp->lock, flags);
 626                        } else if ( n == -EAGAIN ) {
 627                                /*
 628                                 * Some back-ends can only ensure a certain min
 629                                 * num of bytes read, which may be > 'count'.
 630                                 * Let the tty clear the flip buff to make room.
 631                                 */
 632                                poll_mask |= HVC_POLL_READ;
 633                        }
 634                        break;
 635                }
 636                for (i = 0; i < n; ++i) {
 637#ifdef CONFIG_MAGIC_SYSRQ
 638                        if (hp->index == hvc_con_driver.index) {
 639                                /* Handle the SysRq Hack */
 640                                /* XXX should support a sequence */
 641                                if (buf[i] == '\x0f') { /* ^O */
 642                                        /* if ^O is pressed again, reset
 643                                         * sysrq_pressed and flip ^O char */
 644                                        sysrq_pressed = !sysrq_pressed;
 645                                        if (sysrq_pressed)
 646                                                continue;
 647                                } else if (sysrq_pressed) {
 648                                        handle_sysrq(buf[i], tty);
 649                                        sysrq_pressed = 0;
 650                                        continue;
 651                                }
 652                        }
 653#endif /* CONFIG_MAGIC_SYSRQ */
 654                        tty_insert_flip_char(tty, buf[i], 0);
 655                }
 656
 657                read_total += n;
 658        }
 659 throttled:
 660        /* Wakeup write queue if necessary */
 661        if (hp->do_wakeup) {
 662                hp->do_wakeup = 0;
 663                tty_wakeup(tty);
 664        }
 665 bail:
 666        spin_unlock_irqrestore(&hp->lock, flags);
 667
 668        if (read_total) {
 669                /* Activity is occurring, so reset the polling backoff value to
 670                   a minimum for performance. */
 671                timeout = MIN_TIMEOUT;
 672
 673                tty_flip_buffer_push(tty);
 674        }
 675
 676        return poll_mask;
 677}
 678EXPORT_SYMBOL_GPL(hvc_poll);
 679
 680/**
 681 * __hvc_resize() - Update terminal window size information.
 682 * @hp:         HVC console pointer
 683 * @ws:         Terminal window size structure
 684 *
 685 * Stores the specified window size information in the hvc structure of @hp.
 686 * The function schedule the tty resize update.
 687 *
 688 * Locking:     Locking free; the function MUST be called holding hp->lock
 689 */
 690void __hvc_resize(struct hvc_struct *hp, struct winsize ws)
 691{
 692        hp->ws = ws;
 693        schedule_work(&hp->tty_resize);
 694}
 695EXPORT_SYMBOL_GPL(__hvc_resize);
 696
 697/*
 698 * This kthread is either polling or interrupt driven.  This is determined by
 699 * calling hvc_poll() who determines whether a console adapter support
 700 * interrupts.
 701 */
 702static int khvcd(void *unused)
 703{
 704        int poll_mask;
 705        struct hvc_struct *hp;
 706
 707        set_freezable();
 708        __set_current_state(TASK_RUNNING);
 709        do {
 710                poll_mask = 0;
 711                hvc_kicked = 0;
 712                try_to_freeze();
 713                wmb();
 714                if (!cpus_are_in_xmon()) {
 715                        spin_lock(&hvc_structs_lock);
 716                        list_for_each_entry(hp, &hvc_structs, next) {
 717                                poll_mask |= hvc_poll(hp);
 718                        }
 719                        spin_unlock(&hvc_structs_lock);
 720                } else
 721                        poll_mask |= HVC_POLL_READ;
 722                if (hvc_kicked)
 723                        continue;
 724                set_current_state(TASK_INTERRUPTIBLE);
 725                if (!hvc_kicked) {
 726                        if (poll_mask == 0)
 727                                schedule();
 728                        else {
 729                                if (timeout < MAX_TIMEOUT)
 730                                        timeout += (timeout >> 6) + 1;
 731
 732                                msleep_interruptible(timeout);
 733                        }
 734                }
 735                __set_current_state(TASK_RUNNING);
 736        } while (!kthread_should_stop());
 737
 738        return 0;
 739}
 740
 741static const struct tty_operations hvc_ops = {
 742        .open = hvc_open,
 743        .close = hvc_close,
 744        .write = hvc_write,
 745        .hangup = hvc_hangup,
 746        .unthrottle = hvc_unthrottle,
 747        .write_room = hvc_write_room,
 748        .chars_in_buffer = hvc_chars_in_buffer,
 749};
 750
 751struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int data,
 752                                        struct hv_ops *ops, int outbuf_size)
 753{
 754        struct hvc_struct *hp;
 755        int i;
 756
 757        /* We wait until a driver actually comes along */
 758        if (!hvc_driver) {
 759                int err = hvc_init();
 760                if (err)
 761                        return ERR_PTR(err);
 762        }
 763
 764        hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
 765                        GFP_KERNEL);
 766        if (!hp)
 767                return ERR_PTR(-ENOMEM);
 768
 769        hp->vtermno = vtermno;
 770        hp->data = data;
 771        hp->ops = ops;
 772        hp->outbuf_size = outbuf_size;
 773        hp->outbuf = &((char *)hp)[ALIGN(sizeof(*hp), sizeof(long))];
 774
 775        kref_init(&hp->kref);
 776
 777        INIT_WORK(&hp->tty_resize, hvc_set_winsz);
 778        spin_lock_init(&hp->lock);
 779        spin_lock(&hvc_structs_lock);
 780
 781        /*
 782         * find index to use:
 783         * see if this vterm id matches one registered for console.
 784         */
 785        for (i=0; i < MAX_NR_HVC_CONSOLES; i++)
 786                if (vtermnos[i] == hp->vtermno &&
 787                    cons_ops[i] == hp->ops)
 788                        break;
 789
 790        /* no matching slot, just use a counter */
 791        if (i >= MAX_NR_HVC_CONSOLES)
 792                i = ++last_hvc;
 793
 794        hp->index = i;
 795
 796        list_add_tail(&(hp->next), &hvc_structs);
 797        spin_unlock(&hvc_structs_lock);
 798
 799        return hp;
 800}
 801EXPORT_SYMBOL_GPL(hvc_alloc);
 802
 803int hvc_remove(struct hvc_struct *hp)
 804{
 805        unsigned long flags;
 806        struct tty_struct *tty;
 807
 808        spin_lock_irqsave(&hp->lock, flags);
 809        tty = hp->tty;
 810
 811        if (hp->index < MAX_NR_HVC_CONSOLES)
 812                vtermnos[hp->index] = -1;
 813
 814        /* Don't whack hp->irq because tty_hangup() will need to free the irq. */
 815
 816        spin_unlock_irqrestore(&hp->lock, flags);
 817
 818        /*
 819         * We 'put' the instance that was grabbed when the kref instance
 820         * was initialized using kref_init().  Let the last holder of this
 821         * kref cause it to be removed, which will probably be the tty_hangup
 822         * below.
 823         */
 824        kref_put(&hp->kref, destroy_hvc_struct);
 825
 826        /*
 827         * This function call will auto chain call hvc_hangup.  The tty should
 828         * always be valid at this time unless a simultaneous tty close already
 829         * cleaned up the hvc_struct.
 830         */
 831        if (tty)
 832                tty_hangup(tty);
 833        return 0;
 834}
 835
 836/* Driver initialization: called as soon as someone uses hvc_alloc(). */
 837static int hvc_init(void)
 838{
 839        struct tty_driver *drv;
 840        int err;
 841
 842        /* We need more than hvc_count adapters due to hotplug additions. */
 843        drv = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
 844        if (!drv) {
 845                err = -ENOMEM;
 846                goto out;
 847        }
 848
 849        drv->owner = THIS_MODULE;
 850        drv->driver_name = "hvc";
 851        drv->name = "hvc";
 852        drv->major = HVC_MAJOR;
 853        drv->minor_start = HVC_MINOR;
 854        drv->type = TTY_DRIVER_TYPE_SYSTEM;
 855        drv->init_termios = tty_std_termios;
 856        drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
 857        tty_set_operations(drv, &hvc_ops);
 858
 859        /* Always start the kthread because there can be hotplug vty adapters
 860         * added later. */
 861        hvc_task = kthread_run(khvcd, NULL, "khvcd");
 862        if (IS_ERR(hvc_task)) {
 863                printk(KERN_ERR "Couldn't create kthread for console.\n");
 864                err = PTR_ERR(hvc_task);
 865                goto put_tty;
 866        }
 867
 868        err = tty_register_driver(drv);
 869        if (err) {
 870                printk(KERN_ERR "Couldn't register hvc console driver\n");
 871                goto stop_thread;
 872        }
 873
 874        /*
 875         * Make sure tty is fully registered before allowing it to be
 876         * found by hvc_console_device.
 877         */
 878        smp_mb();
 879        hvc_driver = drv;
 880        return 0;
 881
 882stop_thread:
 883        kthread_stop(hvc_task);
 884        hvc_task = NULL;
 885put_tty:
 886        put_tty_driver(drv);
 887out:
 888        return err;
 889}
 890
 891/* This isn't particularly necessary due to this being a console driver
 892 * but it is nice to be thorough.
 893 */
 894static void __exit hvc_exit(void)
 895{
 896        if (hvc_driver) {
 897                kthread_stop(hvc_task);
 898
 899                tty_unregister_driver(hvc_driver);
 900                /* return tty_struct instances allocated in hvc_init(). */
 901                put_tty_driver(hvc_driver);
 902                unregister_console(&hvc_con_driver);
 903        }
 904}
 905module_exit(hvc_exit);
 906