linux/drivers/tty/hvc/hvcs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * IBM eServer Hypervisor Virtual Console Server Device Driver
   4 * Copyright (C) 2003, 2004 IBM Corp.
   5 *  Ryan S. Arnold (rsa@us.ibm.com)
   6 *
   7 * Author(s) :  Ryan S. Arnold <rsa@us.ibm.com>
   8 *
   9 * This is the device driver for the IBM Hypervisor Virtual Console Server,
  10 * "hvcs".  The IBM hvcs provides a tty driver interface to allow Linux
  11 * user space applications access to the system consoles of logically
  12 * partitioned operating systems, e.g. Linux, running on the same partitioned
  13 * Power5 ppc64 system.  Physical hardware consoles per partition are not
  14 * practical on this hardware so system consoles are accessed by this driver
  15 * using inter-partition firmware interfaces to virtual terminal devices.
  16 *
  17 * A vty is known to the HMC as a "virtual serial server adapter".  It is a
  18 * virtual terminal device that is created by firmware upon partition creation
  19 * to act as a partitioned OS's console device.
  20 *
  21 * Firmware dynamically (via hotplug) exposes vty-servers to a running ppc64
  22 * Linux system upon their creation by the HMC or their exposure during boot.
  23 * The non-user interactive backend of this driver is implemented as a vio
  24 * device driver so that it can receive notification of vty-server lifetimes
  25 * after it registers with the vio bus to handle vty-server probe and remove
  26 * callbacks.
  27 *
  28 * Many vty-servers can be configured to connect to one vty, but a vty can
  29 * only be actively connected to by a single vty-server, in any manner, at one
  30 * time.  If the HMC is currently hosting the console for a target Linux
  31 * partition; attempts to open the tty device to the partition's console using
  32 * the hvcs on any partition will return -EBUSY with every open attempt until
  33 * the HMC frees the connection between its vty-server and the desired
  34 * partition's vty device.  Conversely, a vty-server may only be connected to
  35 * a single vty at one time even though it may have several configured vty
  36 * partner possibilities.
  37 *
  38 * Firmware does not provide notification of vty partner changes to this
  39 * driver.  This means that an HMC Super Admin may add or remove partner vtys
  40 * from a vty-server's partner list but the changes will not be signaled to
  41 * the vty-server.  Firmware only notifies the driver when a vty-server is
  42 * added or removed from the system.  To compensate for this deficiency, this
  43 * driver implements a sysfs update attribute which provides a method for
  44 * rescanning partner information upon a user's request.
  45 *
  46 * Each vty-server, prior to being exposed to this driver is reference counted
  47 * using the 2.6 Linux kernel kref construct.
  48 *
  49 * For direction on installation and usage of this driver please reference
  50 * Documentation/powerpc/hvcs.txt.
  51 */
  52
  53#include <linux/device.h>
  54#include <linux/init.h>
  55#include <linux/interrupt.h>
  56#include <linux/kernel.h>
  57#include <linux/kref.h>
  58#include <linux/kthread.h>
  59#include <linux/list.h>
  60#include <linux/major.h>
  61#include <linux/module.h>
  62#include <linux/moduleparam.h>
  63#include <linux/sched.h>
  64#include <linux/slab.h>
  65#include <linux/spinlock.h>
  66#include <linux/stat.h>
  67#include <linux/tty.h>
  68#include <linux/tty_flip.h>
  69#include <asm/hvconsole.h>
  70#include <asm/hvcserver.h>
  71#include <linux/uaccess.h>
  72#include <asm/vio.h>
  73
  74/*
  75 * 1.3.0 -> 1.3.1 In hvcs_open memset(..,0x00,..) instead of memset(..,0x3F,00).
  76 * Removed braces around single statements following conditionals.  Removed '=
  77 * 0' after static int declarations since these default to zero.  Removed
  78 * list_for_each_safe() and replaced with list_for_each_entry() in
  79 * hvcs_get_by_index().  The 'safe' version is un-needed now that the driver is
  80 * using spinlocks.  Changed spin_lock_irqsave() to spin_lock() when locking
  81 * hvcs_structs_lock and hvcs_pi_lock since these are not touched in an int
  82 * handler.  Initialized hvcs_structs_lock and hvcs_pi_lock to
  83 * SPIN_LOCK_UNLOCKED at declaration time rather than in hvcs_module_init().
  84 * Added spin_lock around list_del() in destroy_hvcs_struct() to protect the
  85 * list traversals from a deletion.  Removed '= NULL' from pointer declaration
  86 * statements since they are initialized NULL by default.  Removed wmb()
  87 * instances from hvcs_try_write().  They probably aren't needed with locking in
  88 * place.  Added check and cleanup for hvcs_pi_buff = kmalloc() in
  89 * hvcs_module_init().  Exposed hvcs_struct.index via a sysfs attribute so that
  90 * the coupling between /dev/hvcs* and a vty-server can be automatically
  91 * determined.  Moved kobject_put() in hvcs_open outside of the
  92 * spin_unlock_irqrestore().
  93 *
  94 * 1.3.1 -> 1.3.2 Changed method for determining hvcs_struct->index and had it
  95 * align with how the tty layer always assigns the lowest index available.  This
  96 * change resulted in a list of ints that denotes which indexes are available.
  97 * Device additions and removals use the new hvcs_get_index() and
  98 * hvcs_return_index() helper functions.  The list is created with
  99 * hvsc_alloc_index_list() and it is destroyed with hvcs_free_index_list().
 100 * Without these fixes hotplug vty-server adapter support goes crazy with this
 101 * driver if the user removes a vty-server adapter.  Moved free_irq() outside of
 102 * the hvcs_final_close() function in order to get it out of the spinlock.
 103 * Rearranged hvcs_close().  Cleaned up some printks and did some housekeeping
 104 * on the changelog.  Removed local CLC_LENGTH and used HVCS_CLC_LENGTH from
 105 * arch/powerepc/include/asm/hvcserver.h
 106 *
 107 * 1.3.2 -> 1.3.3 Replaced yield() in hvcs_close() with tty_wait_until_sent() to
 108 * prevent possible lockup with realtime scheduling as similarly pointed out by
 109 * akpm in hvc_console.  Changed resulted in the removal of hvcs_final_close()
 110 * to reorder cleanup operations and prevent discarding of pending data during
 111 * an hvcs_close().  Removed spinlock protection of hvcs_struct data members in
 112 * hvcs_write_room() and hvcs_chars_in_buffer() because they aren't needed.
 113 */
 114
 115#define HVCS_DRIVER_VERSION "1.3.3"
 116
 117MODULE_AUTHOR("Ryan S. Arnold <rsa@us.ibm.com>");
 118MODULE_DESCRIPTION("IBM hvcs (Hypervisor Virtual Console Server) Driver");
 119MODULE_LICENSE("GPL");
 120MODULE_VERSION(HVCS_DRIVER_VERSION);
 121
 122/*
 123 * Wait this long per iteration while trying to push buffered data to the
 124 * hypervisor before allowing the tty to complete a close operation.
 125 */
 126#define HVCS_CLOSE_WAIT (HZ/100) /* 1/10 of a second */
 127
 128/*
 129 * Since the Linux TTY code does not currently (2-04-2004) support dynamic
 130 * addition of tty derived devices and we shouldn't allocate thousands of
 131 * tty_device pointers when the number of vty-server & vty partner connections
 132 * will most often be much lower than this, we'll arbitrarily allocate
 133 * HVCS_DEFAULT_SERVER_ADAPTERS tty_structs and cdev's by default when we
 134 * register the tty_driver. This can be overridden using an insmod parameter.
 135 */
 136#define HVCS_DEFAULT_SERVER_ADAPTERS    64
 137
 138/*
 139 * The user can't insmod with more than HVCS_MAX_SERVER_ADAPTERS hvcs device
 140 * nodes as a sanity check.  Theoretically there can be over 1 Billion
 141 * vty-server & vty partner connections.
 142 */
 143#define HVCS_MAX_SERVER_ADAPTERS        1024
 144
 145/*
 146 * We let Linux assign us a major number and we start the minors at zero.  There
 147 * is no intuitive mapping between minor number and the target vty-server
 148 * adapter except that each new vty-server adapter is always assigned to the
 149 * smallest minor number available.
 150 */
 151#define HVCS_MINOR_START        0
 152
 153/*
 154 * The hcall interface involves putting 8 chars into each of two registers.
 155 * We load up those 2 registers (in arch/powerpc/platforms/pseries/hvconsole.c)
 156 * by casting char[16] to long[2].  It would work without __ALIGNED__, but a 
 157 * little (tiny) bit slower because an unaligned load is slower than aligned 
 158 * load.
 159 */
 160#define __ALIGNED__     __attribute__((__aligned__(8)))
 161
 162/*
 163 * How much data can firmware send with each hvc_put_chars()?  Maybe this
 164 * should be moved into an architecture specific area.
 165 */
 166#define HVCS_BUFF_LEN   16
 167
 168/*
 169 * This is the maximum amount of data we'll let the user send us (hvcs_write) at
 170 * once in a chunk as a sanity check.
 171 */
 172#define HVCS_MAX_FROM_USER      4096
 173
 174/*
 175 * Be careful when adding flags to this line discipline.  Don't add anything
 176 * that will cause echoing or we'll go into recursive loop echoing chars back
 177 * and forth with the console drivers.
 178 */
 179static const struct ktermios hvcs_tty_termios = {
 180        .c_iflag = IGNBRK | IGNPAR,
 181        .c_oflag = OPOST,
 182        .c_cflag = B38400 | CS8 | CREAD | HUPCL,
 183        .c_cc = INIT_C_CC,
 184        .c_ispeed = 38400,
 185        .c_ospeed = 38400
 186};
 187
 188/*
 189 * This value is used to take the place of a command line parameter when the
 190 * module is inserted.  It starts as -1 and stays as such if the user doesn't
 191 * specify a module insmod parameter.  If they DO specify one then it is set to
 192 * the value of the integer passed in.
 193 */
 194static int hvcs_parm_num_devs = -1;
 195module_param(hvcs_parm_num_devs, int, 0);
 196
 197static const char hvcs_driver_name[] = "hvcs";
 198static const char hvcs_device_node[] = "hvcs";
 199static const char hvcs_driver_string[]
 200        = "IBM hvcs (Hypervisor Virtual Console Server) Driver";
 201
 202/* Status of partner info rescan triggered via sysfs. */
 203static int hvcs_rescan_status;
 204
 205static struct tty_driver *hvcs_tty_driver;
 206
 207/*
 208 * In order to be somewhat sane this driver always associates the hvcs_struct
 209 * index element with the numerically equal tty->index.  This means that a
 210 * hotplugged vty-server adapter will always map to the lowest index valued
 211 * device node.  If vty-servers were hotplug removed from the system and then
 212 * new ones added the new vty-server may have the largest slot number of all
 213 * the vty-server adapters in the partition but it may have the lowest dev node
 214 * index of all the adapters due to the hole left by the hotplug removed
 215 * adapter.  There are a set of functions provided to get the lowest index for
 216 * a new device as well as return the index to the list.  This list is allocated
 217 * with a number of elements equal to the number of device nodes requested when
 218 * the module was inserted.
 219 */
 220static int *hvcs_index_list;
 221
 222/*
 223 * How large is the list?  This is kept for traversal since the list is
 224 * dynamically created.
 225 */
 226static int hvcs_index_count;
 227
 228/*
 229 * Used by the khvcsd to pick up I/O operations when the kernel_thread is
 230 * already awake but potentially shifted to TASK_INTERRUPTIBLE state.
 231 */
 232static int hvcs_kicked;
 233
 234/*
 235 * Use by the kthread construct for task operations like waking the sleeping
 236 * thread and stopping the kthread.
 237 */
 238static struct task_struct *hvcs_task;
 239
 240/*
 241 * We allocate this for the use of all of the hvcs_structs when they fetch
 242 * partner info.
 243 */
 244static unsigned long *hvcs_pi_buff;
 245
 246/* Only allow one hvcs_struct to use the hvcs_pi_buff at a time. */
 247static DEFINE_SPINLOCK(hvcs_pi_lock);
 248
 249/* One vty-server per hvcs_struct */
 250struct hvcs_struct {
 251        struct tty_port port;
 252        spinlock_t lock;
 253
 254        /*
 255         * This index identifies this hvcs device as the complement to a
 256         * specific tty index.
 257         */
 258        unsigned int index;
 259
 260        /*
 261         * Used to tell the driver kernel_thread what operations need to take
 262         * place upon this hvcs_struct instance.
 263         */
 264        int todo_mask;
 265
 266        /*
 267         * This buffer is required so that when hvcs_write_room() reports that
 268         * it can send HVCS_BUFF_LEN characters that it will buffer the full
 269         * HVCS_BUFF_LEN characters if need be.  This is essential for opost
 270         * writes since they do not do high level buffering and expect to be
 271         * able to send what the driver commits to sending buffering
 272         * [e.g. tab to space conversions in n_tty.c opost()].
 273         */
 274        char buffer[HVCS_BUFF_LEN];
 275        int chars_in_buffer;
 276
 277        /*
 278         * Any variable below is valid before a tty is connected and
 279         * stays valid after the tty is disconnected.  These shouldn't be
 280         * whacked until the kobject refcount reaches zero though some entries
 281         * may be changed via sysfs initiatives.
 282         */
 283        int connected; /* is the vty-server currently connected to a vty? */
 284        uint32_t p_unit_address; /* partner unit address */
 285        uint32_t p_partition_ID; /* partner partition ID */
 286        char p_location_code[HVCS_CLC_LENGTH + 1]; /* CLC + Null Term */
 287        struct list_head next; /* list management */
 288        struct vio_dev *vdev;
 289};
 290
 291static LIST_HEAD(hvcs_structs);
 292static DEFINE_SPINLOCK(hvcs_structs_lock);
 293static DEFINE_MUTEX(hvcs_init_mutex);
 294
 295static void hvcs_unthrottle(struct tty_struct *tty);
 296static void hvcs_throttle(struct tty_struct *tty);
 297static irqreturn_t hvcs_handle_interrupt(int irq, void *dev_instance);
 298
 299static int hvcs_write(struct tty_struct *tty,
 300                const unsigned char *buf, int count);
 301static int hvcs_write_room(struct tty_struct *tty);
 302static int hvcs_chars_in_buffer(struct tty_struct *tty);
 303
 304static int hvcs_has_pi(struct hvcs_struct *hvcsd);
 305static void hvcs_set_pi(struct hvcs_partner_info *pi,
 306                struct hvcs_struct *hvcsd);
 307static int hvcs_get_pi(struct hvcs_struct *hvcsd);
 308static int hvcs_rescan_devices_list(void);
 309
 310static int hvcs_partner_connect(struct hvcs_struct *hvcsd);
 311static void hvcs_partner_free(struct hvcs_struct *hvcsd);
 312
 313static int hvcs_enable_device(struct hvcs_struct *hvcsd,
 314                uint32_t unit_address, unsigned int irq, struct vio_dev *dev);
 315
 316static int hvcs_open(struct tty_struct *tty, struct file *filp);
 317static void hvcs_close(struct tty_struct *tty, struct file *filp);
 318static void hvcs_hangup(struct tty_struct * tty);
 319
 320static int hvcs_probe(struct vio_dev *dev,
 321                const struct vio_device_id *id);
 322static int hvcs_remove(struct vio_dev *dev);
 323static int __init hvcs_module_init(void);
 324static void __exit hvcs_module_exit(void);
 325static int hvcs_initialize(void);
 326
 327#define HVCS_SCHED_READ 0x00000001
 328#define HVCS_QUICK_READ 0x00000002
 329#define HVCS_TRY_WRITE  0x00000004
 330#define HVCS_READ_MASK  (HVCS_SCHED_READ | HVCS_QUICK_READ)
 331
 332static inline struct hvcs_struct *from_vio_dev(struct vio_dev *viod)
 333{
 334        return dev_get_drvdata(&viod->dev);
 335}
 336/* The sysfs interface for the driver and devices */
 337
 338static ssize_t hvcs_partner_vtys_show(struct device *dev, struct device_attribute *attr, char *buf)
 339{
 340        struct vio_dev *viod = to_vio_dev(dev);
 341        struct hvcs_struct *hvcsd = from_vio_dev(viod);
 342        unsigned long flags;
 343        int retval;
 344
 345        spin_lock_irqsave(&hvcsd->lock, flags);
 346        retval = sprintf(buf, "%X\n", hvcsd->p_unit_address);
 347        spin_unlock_irqrestore(&hvcsd->lock, flags);
 348        return retval;
 349}
 350static DEVICE_ATTR(partner_vtys, S_IRUGO, hvcs_partner_vtys_show, NULL);
 351
 352static ssize_t hvcs_partner_clcs_show(struct device *dev, struct device_attribute *attr, char *buf)
 353{
 354        struct vio_dev *viod = to_vio_dev(dev);
 355        struct hvcs_struct *hvcsd = from_vio_dev(viod);
 356        unsigned long flags;
 357        int retval;
 358
 359        spin_lock_irqsave(&hvcsd->lock, flags);
 360        retval = sprintf(buf, "%s\n", &hvcsd->p_location_code[0]);
 361        spin_unlock_irqrestore(&hvcsd->lock, flags);
 362        return retval;
 363}
 364static DEVICE_ATTR(partner_clcs, S_IRUGO, hvcs_partner_clcs_show, NULL);
 365
 366static ssize_t hvcs_current_vty_store(struct device *dev, struct device_attribute *attr, const char * buf,
 367                size_t count)
 368{
 369        /*
 370         * Don't need this feature at the present time because firmware doesn't
 371         * yet support multiple partners.
 372         */
 373        printk(KERN_INFO "HVCS: Denied current_vty change: -EPERM.\n");
 374        return -EPERM;
 375}
 376
 377static ssize_t hvcs_current_vty_show(struct device *dev, struct device_attribute *attr, char *buf)
 378{
 379        struct vio_dev *viod = to_vio_dev(dev);
 380        struct hvcs_struct *hvcsd = from_vio_dev(viod);
 381        unsigned long flags;
 382        int retval;
 383
 384        spin_lock_irqsave(&hvcsd->lock, flags);
 385        retval = sprintf(buf, "%s\n", &hvcsd->p_location_code[0]);
 386        spin_unlock_irqrestore(&hvcsd->lock, flags);
 387        return retval;
 388}
 389
 390static DEVICE_ATTR(current_vty,
 391        S_IRUGO | S_IWUSR, hvcs_current_vty_show, hvcs_current_vty_store);
 392
 393static ssize_t hvcs_vterm_state_store(struct device *dev, struct device_attribute *attr, const char *buf,
 394                size_t count)
 395{
 396        struct vio_dev *viod = to_vio_dev(dev);
 397        struct hvcs_struct *hvcsd = from_vio_dev(viod);
 398        unsigned long flags;
 399
 400        /* writing a '0' to this sysfs entry will result in the disconnect. */
 401        if (simple_strtol(buf, NULL, 0) != 0)
 402                return -EINVAL;
 403
 404        spin_lock_irqsave(&hvcsd->lock, flags);
 405
 406        if (hvcsd->port.count > 0) {
 407                spin_unlock_irqrestore(&hvcsd->lock, flags);
 408                printk(KERN_INFO "HVCS: vterm state unchanged.  "
 409                                "The hvcs device node is still in use.\n");
 410                return -EPERM;
 411        }
 412
 413        if (hvcsd->connected == 0) {
 414                spin_unlock_irqrestore(&hvcsd->lock, flags);
 415                printk(KERN_INFO "HVCS: vterm state unchanged. The"
 416                                " vty-server is not connected to a vty.\n");
 417                return -EPERM;
 418        }
 419
 420        hvcs_partner_free(hvcsd);
 421        printk(KERN_INFO "HVCS: Closed vty-server@%X and"
 422                        " partner vty@%X:%d connection.\n",
 423                        hvcsd->vdev->unit_address,
 424                        hvcsd->p_unit_address,
 425                        (uint32_t)hvcsd->p_partition_ID);
 426
 427        spin_unlock_irqrestore(&hvcsd->lock, flags);
 428        return count;
 429}
 430
 431static ssize_t hvcs_vterm_state_show(struct device *dev, struct device_attribute *attr, char *buf)
 432{
 433        struct vio_dev *viod = to_vio_dev(dev);
 434        struct hvcs_struct *hvcsd = from_vio_dev(viod);
 435        unsigned long flags;
 436        int retval;
 437
 438        spin_lock_irqsave(&hvcsd->lock, flags);
 439        retval = sprintf(buf, "%d\n", hvcsd->connected);
 440        spin_unlock_irqrestore(&hvcsd->lock, flags);
 441        return retval;
 442}
 443static DEVICE_ATTR(vterm_state, S_IRUGO | S_IWUSR,
 444                hvcs_vterm_state_show, hvcs_vterm_state_store);
 445
 446static ssize_t hvcs_index_show(struct device *dev, struct device_attribute *attr, char *buf)
 447{
 448        struct vio_dev *viod = to_vio_dev(dev);
 449        struct hvcs_struct *hvcsd = from_vio_dev(viod);
 450        unsigned long flags;
 451        int retval;
 452
 453        spin_lock_irqsave(&hvcsd->lock, flags);
 454        retval = sprintf(buf, "%d\n", hvcsd->index);
 455        spin_unlock_irqrestore(&hvcsd->lock, flags);
 456        return retval;
 457}
 458
 459static DEVICE_ATTR(index, S_IRUGO, hvcs_index_show, NULL);
 460
 461static struct attribute *hvcs_attrs[] = {
 462        &dev_attr_partner_vtys.attr,
 463        &dev_attr_partner_clcs.attr,
 464        &dev_attr_current_vty.attr,
 465        &dev_attr_vterm_state.attr,
 466        &dev_attr_index.attr,
 467        NULL,
 468};
 469
 470static struct attribute_group hvcs_attr_group = {
 471        .attrs = hvcs_attrs,
 472};
 473
 474static ssize_t rescan_show(struct device_driver *ddp, char *buf)
 475{
 476        /* A 1 means it is updating, a 0 means it is done updating */
 477        return snprintf(buf, PAGE_SIZE, "%d\n", hvcs_rescan_status);
 478}
 479
 480static ssize_t rescan_store(struct device_driver *ddp, const char * buf,
 481                size_t count)
 482{
 483        if ((simple_strtol(buf, NULL, 0) != 1)
 484                && (hvcs_rescan_status != 0))
 485                return -EINVAL;
 486
 487        hvcs_rescan_status = 1;
 488        printk(KERN_INFO "HVCS: rescanning partner info for all"
 489                " vty-servers.\n");
 490        hvcs_rescan_devices_list();
 491        hvcs_rescan_status = 0;
 492        return count;
 493}
 494
 495static DRIVER_ATTR_RW(rescan);
 496
 497static void hvcs_kick(void)
 498{
 499        hvcs_kicked = 1;
 500        wmb();
 501        wake_up_process(hvcs_task);
 502}
 503
 504static void hvcs_unthrottle(struct tty_struct *tty)
 505{
 506        struct hvcs_struct *hvcsd = tty->driver_data;
 507        unsigned long flags;
 508
 509        spin_lock_irqsave(&hvcsd->lock, flags);
 510        hvcsd->todo_mask |= HVCS_SCHED_READ;
 511        spin_unlock_irqrestore(&hvcsd->lock, flags);
 512        hvcs_kick();
 513}
 514
 515static void hvcs_throttle(struct tty_struct *tty)
 516{
 517        struct hvcs_struct *hvcsd = tty->driver_data;
 518        unsigned long flags;
 519
 520        spin_lock_irqsave(&hvcsd->lock, flags);
 521        vio_disable_interrupts(hvcsd->vdev);
 522        spin_unlock_irqrestore(&hvcsd->lock, flags);
 523}
 524
 525/*
 526 * If the device is being removed we don't have to worry about this interrupt
 527 * handler taking any further interrupts because they are disabled which means
 528 * the hvcs_struct will always be valid in this handler.
 529 */
 530static irqreturn_t hvcs_handle_interrupt(int irq, void *dev_instance)
 531{
 532        struct hvcs_struct *hvcsd = dev_instance;
 533
 534        spin_lock(&hvcsd->lock);
 535        vio_disable_interrupts(hvcsd->vdev);
 536        hvcsd->todo_mask |= HVCS_SCHED_READ;
 537        spin_unlock(&hvcsd->lock);
 538        hvcs_kick();
 539
 540        return IRQ_HANDLED;
 541}
 542
 543/* This function must be called with the hvcsd->lock held */
 544static void hvcs_try_write(struct hvcs_struct *hvcsd)
 545{
 546        uint32_t unit_address = hvcsd->vdev->unit_address;
 547        struct tty_struct *tty = hvcsd->port.tty;
 548        int sent;
 549
 550        if (hvcsd->todo_mask & HVCS_TRY_WRITE) {
 551                /* won't send partial writes */
 552                sent = hvc_put_chars(unit_address,
 553                                &hvcsd->buffer[0],
 554                                hvcsd->chars_in_buffer );
 555                if (sent > 0) {
 556                        hvcsd->chars_in_buffer = 0;
 557                        /* wmb(); */
 558                        hvcsd->todo_mask &= ~(HVCS_TRY_WRITE);
 559                        /* wmb(); */
 560
 561                        /*
 562                         * We are still obligated to deliver the data to the
 563                         * hypervisor even if the tty has been closed because
 564                         * we committed to delivering it.  But don't try to wake
 565                         * a non-existent tty.
 566                         */
 567                        if (tty) {
 568                                tty_wakeup(tty);
 569                        }
 570                }
 571        }
 572}
 573
 574static int hvcs_io(struct hvcs_struct *hvcsd)
 575{
 576        uint32_t unit_address;
 577        struct tty_struct *tty;
 578        char buf[HVCS_BUFF_LEN] __ALIGNED__;
 579        unsigned long flags;
 580        int got = 0;
 581
 582        spin_lock_irqsave(&hvcsd->lock, flags);
 583
 584        unit_address = hvcsd->vdev->unit_address;
 585        tty = hvcsd->port.tty;
 586
 587        hvcs_try_write(hvcsd);
 588
 589        if (!tty || tty_throttled(tty)) {
 590                hvcsd->todo_mask &= ~(HVCS_READ_MASK);
 591                goto bail;
 592        } else if (!(hvcsd->todo_mask & (HVCS_READ_MASK)))
 593                goto bail;
 594
 595        /* remove the read masks */
 596        hvcsd->todo_mask &= ~(HVCS_READ_MASK);
 597
 598        if (tty_buffer_request_room(&hvcsd->port, HVCS_BUFF_LEN) >= HVCS_BUFF_LEN) {
 599                got = hvc_get_chars(unit_address,
 600                                &buf[0],
 601                                HVCS_BUFF_LEN);
 602                tty_insert_flip_string(&hvcsd->port, buf, got);
 603        }
 604
 605        /* Give the TTY time to process the data we just sent. */
 606        if (got)
 607                hvcsd->todo_mask |= HVCS_QUICK_READ;
 608
 609        spin_unlock_irqrestore(&hvcsd->lock, flags);
 610        /* This is synch because tty->low_latency == 1 */
 611        if(got)
 612                tty_flip_buffer_push(&hvcsd->port);
 613
 614        if (!got) {
 615                /* Do this _after_ the flip_buffer_push */
 616                spin_lock_irqsave(&hvcsd->lock, flags);
 617                vio_enable_interrupts(hvcsd->vdev);
 618                spin_unlock_irqrestore(&hvcsd->lock, flags);
 619        }
 620
 621        return hvcsd->todo_mask;
 622
 623 bail:
 624        spin_unlock_irqrestore(&hvcsd->lock, flags);
 625        return hvcsd->todo_mask;
 626}
 627
 628static int khvcsd(void *unused)
 629{
 630        struct hvcs_struct *hvcsd;
 631        int hvcs_todo_mask;
 632
 633        __set_current_state(TASK_RUNNING);
 634
 635        do {
 636                hvcs_todo_mask = 0;
 637                hvcs_kicked = 0;
 638                wmb();
 639
 640                spin_lock(&hvcs_structs_lock);
 641                list_for_each_entry(hvcsd, &hvcs_structs, next) {
 642                        hvcs_todo_mask |= hvcs_io(hvcsd);
 643                }
 644                spin_unlock(&hvcs_structs_lock);
 645
 646                /*
 647                 * If any of the hvcs adapters want to try a write or quick read
 648                 * don't schedule(), yield a smidgen then execute the hvcs_io
 649                 * thread again for those that want the write.
 650                 */
 651                 if (hvcs_todo_mask & (HVCS_TRY_WRITE | HVCS_QUICK_READ)) {
 652                        yield();
 653                        continue;
 654                }
 655
 656                set_current_state(TASK_INTERRUPTIBLE);
 657                if (!hvcs_kicked)
 658                        schedule();
 659                __set_current_state(TASK_RUNNING);
 660        } while (!kthread_should_stop());
 661
 662        return 0;
 663}
 664
 665static const struct vio_device_id hvcs_driver_table[] = {
 666        {"serial-server", "hvterm2"},
 667        { "", "" }
 668};
 669MODULE_DEVICE_TABLE(vio, hvcs_driver_table);
 670
 671static void hvcs_return_index(int index)
 672{
 673        /* Paranoia check */
 674        if (!hvcs_index_list)
 675                return;
 676        if (index < 0 || index >= hvcs_index_count)
 677                return;
 678        if (hvcs_index_list[index] == -1)
 679                return;
 680        else
 681                hvcs_index_list[index] = -1;
 682}
 683
 684static void hvcs_destruct_port(struct tty_port *p)
 685{
 686        struct hvcs_struct *hvcsd = container_of(p, struct hvcs_struct, port);
 687        struct vio_dev *vdev;
 688        unsigned long flags;
 689
 690        spin_lock(&hvcs_structs_lock);
 691        spin_lock_irqsave(&hvcsd->lock, flags);
 692
 693        /* the list_del poisons the pointers */
 694        list_del(&(hvcsd->next));
 695
 696        if (hvcsd->connected == 1) {
 697                hvcs_partner_free(hvcsd);
 698                printk(KERN_INFO "HVCS: Closed vty-server@%X and"
 699                                " partner vty@%X:%d connection.\n",
 700                                hvcsd->vdev->unit_address,
 701                                hvcsd->p_unit_address,
 702                                (uint32_t)hvcsd->p_partition_ID);
 703        }
 704        printk(KERN_INFO "HVCS: Destroyed hvcs_struct for vty-server@%X.\n",
 705                        hvcsd->vdev->unit_address);
 706
 707        vdev = hvcsd->vdev;
 708        hvcsd->vdev = NULL;
 709
 710        hvcsd->p_unit_address = 0;
 711        hvcsd->p_partition_ID = 0;
 712        hvcs_return_index(hvcsd->index);
 713        memset(&hvcsd->p_location_code[0], 0x00, HVCS_CLC_LENGTH + 1);
 714
 715        spin_unlock_irqrestore(&hvcsd->lock, flags);
 716        spin_unlock(&hvcs_structs_lock);
 717
 718        sysfs_remove_group(&vdev->dev.kobj, &hvcs_attr_group);
 719
 720        kfree(hvcsd);
 721}
 722
 723static const struct tty_port_operations hvcs_port_ops = {
 724        .destruct = hvcs_destruct_port,
 725};
 726
 727static int hvcs_get_index(void)
 728{
 729        int i;
 730        /* Paranoia check */
 731        if (!hvcs_index_list) {
 732                printk(KERN_ERR "HVCS: hvcs_index_list NOT valid!.\n");
 733                return -EFAULT;
 734        }
 735        /* Find the numerically lowest first free index. */
 736        for(i = 0; i < hvcs_index_count; i++) {
 737                if (hvcs_index_list[i] == -1) {
 738                        hvcs_index_list[i] = 0;
 739                        return i;
 740                }
 741        }
 742        return -1;
 743}
 744
 745static int hvcs_probe(
 746        struct vio_dev *dev,
 747        const struct vio_device_id *id)
 748{
 749        struct hvcs_struct *hvcsd;
 750        int index, rc;
 751        int retval;
 752
 753        if (!dev || !id) {
 754                printk(KERN_ERR "HVCS: probed with invalid parameter.\n");
 755                return -EPERM;
 756        }
 757
 758        /* Make sure we are properly initialized */
 759        rc = hvcs_initialize();
 760        if (rc) {
 761                pr_err("HVCS: Failed to initialize core driver.\n");
 762                return rc;
 763        }
 764
 765        /* early to avoid cleanup on failure */
 766        index = hvcs_get_index();
 767        if (index < 0) {
 768                return -EFAULT;
 769        }
 770
 771        hvcsd = kzalloc(sizeof(*hvcsd), GFP_KERNEL);
 772        if (!hvcsd)
 773                return -ENODEV;
 774
 775        tty_port_init(&hvcsd->port);
 776        hvcsd->port.ops = &hvcs_port_ops;
 777        spin_lock_init(&hvcsd->lock);
 778
 779        hvcsd->vdev = dev;
 780        dev_set_drvdata(&dev->dev, hvcsd);
 781
 782        hvcsd->index = index;
 783
 784        /* hvcsd->index = ++hvcs_struct_count; */
 785        hvcsd->chars_in_buffer = 0;
 786        hvcsd->todo_mask = 0;
 787        hvcsd->connected = 0;
 788
 789        /*
 790         * This will populate the hvcs_struct's partner info fields for the
 791         * first time.
 792         */
 793        if (hvcs_get_pi(hvcsd)) {
 794                printk(KERN_ERR "HVCS: Failed to fetch partner"
 795                        " info for vty-server@%X on device probe.\n",
 796                        hvcsd->vdev->unit_address);
 797        }
 798
 799        /*
 800         * If a user app opens a tty that corresponds to this vty-server before
 801         * the hvcs_struct has been added to the devices list then the user app
 802         * will get -ENODEV.
 803         */
 804        spin_lock(&hvcs_structs_lock);
 805        list_add_tail(&(hvcsd->next), &hvcs_structs);
 806        spin_unlock(&hvcs_structs_lock);
 807
 808        retval = sysfs_create_group(&dev->dev.kobj, &hvcs_attr_group);
 809        if (retval) {
 810                printk(KERN_ERR "HVCS: Can't create sysfs attrs for vty-server@%X\n",
 811                       hvcsd->vdev->unit_address);
 812                return retval;
 813        }
 814
 815        printk(KERN_INFO "HVCS: vty-server@%X added to the vio bus.\n", dev->unit_address);
 816
 817        /*
 818         * DON'T enable interrupts here because there is no user to receive the
 819         * data.
 820         */
 821        return 0;
 822}
 823
 824static int hvcs_remove(struct vio_dev *dev)
 825{
 826        struct hvcs_struct *hvcsd = dev_get_drvdata(&dev->dev);
 827        unsigned long flags;
 828        struct tty_struct *tty;
 829
 830        if (!hvcsd)
 831                return -ENODEV;
 832
 833        /* By this time the vty-server won't be getting any more interrupts */
 834
 835        spin_lock_irqsave(&hvcsd->lock, flags);
 836
 837        tty = hvcsd->port.tty;
 838
 839        spin_unlock_irqrestore(&hvcsd->lock, flags);
 840
 841        /*
 842         * Let the last holder of this object cause it to be removed, which
 843         * would probably be tty_hangup below.
 844         */
 845        tty_port_put(&hvcsd->port);
 846
 847        /*
 848         * The hangup is a scheduled function which will auto chain call
 849         * hvcs_hangup.  The tty should always be valid at this time unless a
 850         * simultaneous tty close already cleaned up the hvcs_struct.
 851         */
 852        if (tty)
 853                tty_hangup(tty);
 854
 855        printk(KERN_INFO "HVCS: vty-server@%X removed from the"
 856                        " vio bus.\n", dev->unit_address);
 857        return 0;
 858};
 859
 860static struct vio_driver hvcs_vio_driver = {
 861        .id_table       = hvcs_driver_table,
 862        .probe          = hvcs_probe,
 863        .remove         = hvcs_remove,
 864        .name           = hvcs_driver_name,
 865};
 866
 867/* Only called from hvcs_get_pi please */
 868static void hvcs_set_pi(struct hvcs_partner_info *pi, struct hvcs_struct *hvcsd)
 869{
 870        hvcsd->p_unit_address = pi->unit_address;
 871        hvcsd->p_partition_ID  = pi->partition_ID;
 872
 873        /* copy the null-term char too */
 874        strlcpy(&hvcsd->p_location_code[0],
 875                        &pi->location_code[0], sizeof(hvcsd->p_location_code));
 876}
 877
 878/*
 879 * Traverse the list and add the partner info that is found to the hvcs_struct
 880 * struct entry. NOTE: At this time I know that partner info will return a
 881 * single entry but in the future there may be multiple partner info entries per
 882 * vty-server and you'll want to zero out that list and reset it.  If for some
 883 * reason you have an old version of this driver but there IS more than one
 884 * partner info then hvcsd->p_* will hold the last partner info data from the
 885 * firmware query.  A good way to update this code would be to replace the three
 886 * partner info fields in hvcs_struct with a list of hvcs_partner_info
 887 * instances.
 888 *
 889 * This function must be called with the hvcsd->lock held.
 890 */
 891static int hvcs_get_pi(struct hvcs_struct *hvcsd)
 892{
 893        struct hvcs_partner_info *pi;
 894        uint32_t unit_address = hvcsd->vdev->unit_address;
 895        struct list_head head;
 896        int retval;
 897
 898        spin_lock(&hvcs_pi_lock);
 899        if (!hvcs_pi_buff) {
 900                spin_unlock(&hvcs_pi_lock);
 901                return -EFAULT;
 902        }
 903        retval = hvcs_get_partner_info(unit_address, &head, hvcs_pi_buff);
 904        spin_unlock(&hvcs_pi_lock);
 905        if (retval) {
 906                printk(KERN_ERR "HVCS: Failed to fetch partner"
 907                        " info for vty-server@%x.\n", unit_address);
 908                return retval;
 909        }
 910
 911        /* nixes the values if the partner vty went away */
 912        hvcsd->p_unit_address = 0;
 913        hvcsd->p_partition_ID = 0;
 914
 915        list_for_each_entry(pi, &head, node)
 916                hvcs_set_pi(pi, hvcsd);
 917
 918        hvcs_free_partner_info(&head);
 919        return 0;
 920}
 921
 922/*
 923 * This function is executed by the driver "rescan" sysfs entry.  It shouldn't
 924 * be executed elsewhere, in order to prevent deadlock issues.
 925 */
 926static int hvcs_rescan_devices_list(void)
 927{
 928        struct hvcs_struct *hvcsd;
 929        unsigned long flags;
 930
 931        spin_lock(&hvcs_structs_lock);
 932
 933        list_for_each_entry(hvcsd, &hvcs_structs, next) {
 934                spin_lock_irqsave(&hvcsd->lock, flags);
 935                hvcs_get_pi(hvcsd);
 936                spin_unlock_irqrestore(&hvcsd->lock, flags);
 937        }
 938
 939        spin_unlock(&hvcs_structs_lock);
 940
 941        return 0;
 942}
 943
 944/*
 945 * Farm this off into its own function because it could be more complex once
 946 * multiple partners support is added. This function should be called with
 947 * the hvcsd->lock held.
 948 */
 949static int hvcs_has_pi(struct hvcs_struct *hvcsd)
 950{
 951        if ((!hvcsd->p_unit_address) || (!hvcsd->p_partition_ID))
 952                return 0;
 953        return 1;
 954}
 955
 956/*
 957 * NOTE: It is possible that the super admin removed a partner vty and then
 958 * added a different vty as the new partner.
 959 *
 960 * This function must be called with the hvcsd->lock held.
 961 */
 962static int hvcs_partner_connect(struct hvcs_struct *hvcsd)
 963{
 964        int retval;
 965        unsigned int unit_address = hvcsd->vdev->unit_address;
 966
 967        /*
 968         * If there wasn't any pi when the device was added it doesn't meant
 969         * there isn't any now.  This driver isn't notified when a new partner
 970         * vty is added to a vty-server so we discover changes on our own.
 971         * Please see comments in hvcs_register_connection() for justification
 972         * of this bizarre code.
 973         */
 974        retval = hvcs_register_connection(unit_address,
 975                        hvcsd->p_partition_ID,
 976                        hvcsd->p_unit_address);
 977        if (!retval) {
 978                hvcsd->connected = 1;
 979                return 0;
 980        } else if (retval != -EINVAL)
 981                return retval;
 982
 983        /*
 984         * As per the spec re-get the pi and try again if -EINVAL after the
 985         * first connection attempt.
 986         */
 987        if (hvcs_get_pi(hvcsd))
 988                return -ENOMEM;
 989
 990        if (!hvcs_has_pi(hvcsd))
 991                return -ENODEV;
 992
 993        retval = hvcs_register_connection(unit_address,
 994                        hvcsd->p_partition_ID,
 995                        hvcsd->p_unit_address);
 996        if (retval != -EINVAL) {
 997                hvcsd->connected = 1;
 998                return retval;
 999        }
1000
1001        /*
1002         * EBUSY is the most likely scenario though the vty could have been
1003         * removed or there really could be an hcall error due to the parameter
1004         * data but thanks to ambiguous firmware return codes we can't really
1005         * tell.
1006         */
1007        printk(KERN_INFO "HVCS: vty-server or partner"
1008                        " vty is busy.  Try again later.\n");
1009        return -EBUSY;
1010}
1011
1012/* This function must be called with the hvcsd->lock held */
1013static void hvcs_partner_free(struct hvcs_struct *hvcsd)
1014{
1015        int retval;
1016        do {
1017                retval = hvcs_free_connection(hvcsd->vdev->unit_address);
1018        } while (retval == -EBUSY);
1019        hvcsd->connected = 0;
1020}
1021
1022/* This helper function must be called WITHOUT the hvcsd->lock held */
1023static int hvcs_enable_device(struct hvcs_struct *hvcsd, uint32_t unit_address,
1024                unsigned int irq, struct vio_dev *vdev)
1025{
1026        unsigned long flags;
1027        int rc;
1028
1029        /*
1030         * It is possible that the vty-server was removed between the time that
1031         * the conn was registered and now.
1032         */
1033        rc = request_irq(irq, &hvcs_handle_interrupt, 0, "ibmhvcs", hvcsd);
1034        if (!rc) {
1035                /*
1036                 * It is possible the vty-server was removed after the irq was
1037                 * requested but before we have time to enable interrupts.
1038                 */
1039                if (vio_enable_interrupts(vdev) == H_SUCCESS)
1040                        return 0;
1041                else {
1042                        printk(KERN_ERR "HVCS: int enable failed for"
1043                                        " vty-server@%X.\n", unit_address);
1044                        free_irq(irq, hvcsd);
1045                }
1046        } else
1047                printk(KERN_ERR "HVCS: irq req failed for"
1048                                " vty-server@%X.\n", unit_address);
1049
1050        spin_lock_irqsave(&hvcsd->lock, flags);
1051        hvcs_partner_free(hvcsd);
1052        spin_unlock_irqrestore(&hvcsd->lock, flags);
1053
1054        return rc;
1055
1056}
1057
1058/*
1059 * This always increments the kref ref count if the call is successful.
1060 * Please remember to dec when you are done with the instance.
1061 *
1062 * NOTICE: Do NOT hold either the hvcs_struct.lock or hvcs_structs_lock when
1063 * calling this function or you will get deadlock.
1064 */
1065static struct hvcs_struct *hvcs_get_by_index(int index)
1066{
1067        struct hvcs_struct *hvcsd;
1068        unsigned long flags;
1069
1070        spin_lock(&hvcs_structs_lock);
1071        list_for_each_entry(hvcsd, &hvcs_structs, next) {
1072                spin_lock_irqsave(&hvcsd->lock, flags);
1073                if (hvcsd->index == index) {
1074                        tty_port_get(&hvcsd->port);
1075                        spin_unlock_irqrestore(&hvcsd->lock, flags);
1076                        spin_unlock(&hvcs_structs_lock);
1077                        return hvcsd;
1078                }
1079                spin_unlock_irqrestore(&hvcsd->lock, flags);
1080        }
1081        spin_unlock(&hvcs_structs_lock);
1082
1083        return NULL;
1084}
1085
1086static int hvcs_install(struct tty_driver *driver, struct tty_struct *tty)
1087{
1088        struct hvcs_struct *hvcsd;
1089        struct vio_dev *vdev;
1090        unsigned long unit_address, flags;
1091        unsigned int irq;
1092        int retval;
1093
1094        /*
1095         * Is there a vty-server that shares the same index?
1096         * This function increments the kref index.
1097         */
1098        hvcsd = hvcs_get_by_index(tty->index);
1099        if (!hvcsd) {
1100                printk(KERN_WARNING "HVCS: open failed, no device associated"
1101                                " with tty->index %d.\n", tty->index);
1102                return -ENODEV;
1103        }
1104
1105        spin_lock_irqsave(&hvcsd->lock, flags);
1106
1107        if (hvcsd->connected == 0) {
1108                retval = hvcs_partner_connect(hvcsd);
1109                if (retval) {
1110                        spin_unlock_irqrestore(&hvcsd->lock, flags);
1111                        printk(KERN_WARNING "HVCS: partner connect failed.\n");
1112                        goto err_put;
1113                }
1114        }
1115
1116        hvcsd->port.count = 0;
1117        hvcsd->port.tty = tty;
1118        tty->driver_data = hvcsd;
1119
1120        memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
1121
1122        /*
1123         * Save these in the spinlock for the enable operations that need them
1124         * outside of the spinlock.
1125         */
1126        irq = hvcsd->vdev->irq;
1127        vdev = hvcsd->vdev;
1128        unit_address = hvcsd->vdev->unit_address;
1129
1130        hvcsd->todo_mask |= HVCS_SCHED_READ;
1131        spin_unlock_irqrestore(&hvcsd->lock, flags);
1132
1133        /*
1134         * This must be done outside of the spinlock because it requests irqs
1135         * and will grab the spinlock and free the connection if it fails.
1136         */
1137        retval = hvcs_enable_device(hvcsd, unit_address, irq, vdev);
1138        if (retval) {
1139                printk(KERN_WARNING "HVCS: enable device failed.\n");
1140                goto err_put;
1141        }
1142
1143        retval = tty_port_install(&hvcsd->port, driver, tty);
1144        if (retval)
1145                goto err_irq;
1146
1147        return 0;
1148err_irq:
1149        spin_lock_irqsave(&hvcsd->lock, flags);
1150        vio_disable_interrupts(hvcsd->vdev);
1151        spin_unlock_irqrestore(&hvcsd->lock, flags);
1152        free_irq(irq, hvcsd);
1153err_put:
1154        tty_port_put(&hvcsd->port);
1155
1156        return retval;
1157}
1158
1159/*
1160 * This is invoked via the tty_open interface when a user app connects to the
1161 * /dev node.
1162 */
1163static int hvcs_open(struct tty_struct *tty, struct file *filp)
1164{
1165        struct hvcs_struct *hvcsd = tty->driver_data;
1166        unsigned long flags;
1167
1168        spin_lock_irqsave(&hvcsd->lock, flags);
1169        hvcsd->port.count++;
1170        hvcsd->todo_mask |= HVCS_SCHED_READ;
1171        spin_unlock_irqrestore(&hvcsd->lock, flags);
1172
1173        hvcs_kick();
1174
1175        printk(KERN_INFO "HVCS: vty-server@%X connection opened.\n",
1176                hvcsd->vdev->unit_address );
1177
1178        return 0;
1179}
1180
1181static void hvcs_close(struct tty_struct *tty, struct file *filp)
1182{
1183        struct hvcs_struct *hvcsd;
1184        unsigned long flags;
1185        int irq;
1186
1187        /*
1188         * Is someone trying to close the file associated with this device after
1189         * we have hung up?  If so tty->driver_data wouldn't be valid.
1190         */
1191        if (tty_hung_up_p(filp))
1192                return;
1193
1194        /*
1195         * No driver_data means that this close was probably issued after a
1196         * failed hvcs_open by the tty layer's release_dev() api and we can just
1197         * exit cleanly.
1198         */
1199        if (!tty->driver_data)
1200                return;
1201
1202        hvcsd = tty->driver_data;
1203
1204        spin_lock_irqsave(&hvcsd->lock, flags);
1205        if (--hvcsd->port.count == 0) {
1206
1207                vio_disable_interrupts(hvcsd->vdev);
1208
1209                /*
1210                 * NULL this early so that the kernel_thread doesn't try to
1211                 * execute any operations on the TTY even though it is obligated
1212                 * to deliver any pending I/O to the hypervisor.
1213                 */
1214                hvcsd->port.tty = NULL;
1215
1216                irq = hvcsd->vdev->irq;
1217                spin_unlock_irqrestore(&hvcsd->lock, flags);
1218
1219                tty_wait_until_sent(tty, HVCS_CLOSE_WAIT);
1220
1221                /*
1222                 * This line is important because it tells hvcs_open that this
1223                 * device needs to be re-configured the next time hvcs_open is
1224                 * called.
1225                 */
1226                tty->driver_data = NULL;
1227
1228                free_irq(irq, hvcsd);
1229                return;
1230        } else if (hvcsd->port.count < 0) {
1231                printk(KERN_ERR "HVCS: vty-server@%X open_count: %d is mismanaged.\n",
1232                hvcsd->vdev->unit_address, hvcsd->port.count);
1233        }
1234
1235        spin_unlock_irqrestore(&hvcsd->lock, flags);
1236}
1237
1238static void hvcs_cleanup(struct tty_struct * tty)
1239{
1240        struct hvcs_struct *hvcsd = tty->driver_data;
1241
1242        tty_port_put(&hvcsd->port);
1243}
1244
1245static void hvcs_hangup(struct tty_struct * tty)
1246{
1247        struct hvcs_struct *hvcsd = tty->driver_data;
1248        unsigned long flags;
1249        int temp_open_count;
1250        int irq;
1251
1252        spin_lock_irqsave(&hvcsd->lock, flags);
1253        /* Preserve this so that we know how many kref refs to put */
1254        temp_open_count = hvcsd->port.count;
1255
1256        /*
1257         * Don't kref put inside the spinlock because the destruction
1258         * callback may use the spinlock and it may get called before the
1259         * spinlock has been released.
1260         */
1261        vio_disable_interrupts(hvcsd->vdev);
1262
1263        hvcsd->todo_mask = 0;
1264
1265        /* I don't think the tty needs the hvcs_struct pointer after a hangup */
1266        tty->driver_data = NULL;
1267        hvcsd->port.tty = NULL;
1268
1269        hvcsd->port.count = 0;
1270
1271        /* This will drop any buffered data on the floor which is OK in a hangup
1272         * scenario. */
1273        memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
1274        hvcsd->chars_in_buffer = 0;
1275
1276        irq = hvcsd->vdev->irq;
1277
1278        spin_unlock_irqrestore(&hvcsd->lock, flags);
1279
1280        free_irq(irq, hvcsd);
1281
1282        /*
1283         * We need to kref_put() for every open_count we have since the
1284         * tty_hangup() function doesn't invoke a close per open connection on a
1285         * non-console device.
1286         */
1287        while(temp_open_count) {
1288                --temp_open_count;
1289                /*
1290                 * The final put will trigger destruction of the hvcs_struct.
1291                 * NOTE:  If this hangup was signaled from user space then the
1292                 * final put will never happen.
1293                 */
1294                tty_port_put(&hvcsd->port);
1295        }
1296}
1297
1298/*
1299 * NOTE: This is almost always from_user since user level apps interact with the
1300 * /dev nodes. I'm trusting that if hvcs_write gets called and interrupted by
1301 * hvcs_remove (which removes the target device and executes tty_hangup()) that
1302 * tty_hangup will allow hvcs_write time to complete execution before it
1303 * terminates our device.
1304 */
1305static int hvcs_write(struct tty_struct *tty,
1306                const unsigned char *buf, int count)
1307{
1308        struct hvcs_struct *hvcsd = tty->driver_data;
1309        unsigned int unit_address;
1310        const unsigned char *charbuf;
1311        unsigned long flags;
1312        int total_sent = 0;
1313        int tosend = 0;
1314        int result = 0;
1315
1316        /*
1317         * If they don't check the return code off of their open they may
1318         * attempt this even if there is no connected device.
1319         */
1320        if (!hvcsd)
1321                return -ENODEV;
1322
1323        /* Reasonable size to prevent user level flooding */
1324        if (count > HVCS_MAX_FROM_USER) {
1325                printk(KERN_WARNING "HVCS write: count being truncated to"
1326                                " HVCS_MAX_FROM_USER.\n");
1327                count = HVCS_MAX_FROM_USER;
1328        }
1329
1330        charbuf = buf;
1331
1332        spin_lock_irqsave(&hvcsd->lock, flags);
1333
1334        /*
1335         * Somehow an open succeeded but the device was removed or the
1336         * connection terminated between the vty-server and partner vty during
1337         * the middle of a write operation?  This is a crummy place to do this
1338         * but we want to keep it all in the spinlock.
1339         */
1340        if (hvcsd->port.count <= 0) {
1341                spin_unlock_irqrestore(&hvcsd->lock, flags);
1342                return -ENODEV;
1343        }
1344
1345        unit_address = hvcsd->vdev->unit_address;
1346
1347        while (count > 0) {
1348                tosend = min(count, (HVCS_BUFF_LEN - hvcsd->chars_in_buffer));
1349                /*
1350                 * No more space, this probably means that the last call to
1351                 * hvcs_write() didn't succeed and the buffer was filled up.
1352                 */
1353                if (!tosend)
1354                        break;
1355
1356                memcpy(&hvcsd->buffer[hvcsd->chars_in_buffer],
1357                                &charbuf[total_sent],
1358                                tosend);
1359
1360                hvcsd->chars_in_buffer += tosend;
1361
1362                result = 0;
1363
1364                /*
1365                 * If this is true then we don't want to try writing to the
1366                 * hypervisor because that is the kernel_threads job now.  We'll
1367                 * just add to the buffer.
1368                 */
1369                if (!(hvcsd->todo_mask & HVCS_TRY_WRITE))
1370                        /* won't send partial writes */
1371                        result = hvc_put_chars(unit_address,
1372                                        &hvcsd->buffer[0],
1373                                        hvcsd->chars_in_buffer);
1374
1375                /*
1376                 * Since we know we have enough room in hvcsd->buffer for
1377                 * tosend we record that it was sent regardless of whether the
1378                 * hypervisor actually took it because we have it buffered.
1379                 */
1380                total_sent+=tosend;
1381                count-=tosend;
1382                if (result == 0) {
1383                        hvcsd->todo_mask |= HVCS_TRY_WRITE;
1384                        hvcs_kick();
1385                        break;
1386                }
1387
1388                hvcsd->chars_in_buffer = 0;
1389                /*
1390                 * Test after the chars_in_buffer reset otherwise this could
1391                 * deadlock our writes if hvc_put_chars fails.
1392                 */
1393                if (result < 0)
1394                        break;
1395        }
1396
1397        spin_unlock_irqrestore(&hvcsd->lock, flags);
1398
1399        if (result == -1)
1400                return -EIO;
1401        else
1402                return total_sent;
1403}
1404
1405/*
1406 * This is really asking how much can we guarantee that we can send or that we
1407 * absolutely WILL BUFFER if we can't send it.  This driver MUST honor the
1408 * return value, hence the reason for hvcs_struct buffering.
1409 */
1410static int hvcs_write_room(struct tty_struct *tty)
1411{
1412        struct hvcs_struct *hvcsd = tty->driver_data;
1413
1414        if (!hvcsd || hvcsd->port.count <= 0)
1415                return 0;
1416
1417        return HVCS_BUFF_LEN - hvcsd->chars_in_buffer;
1418}
1419
1420static int hvcs_chars_in_buffer(struct tty_struct *tty)
1421{
1422        struct hvcs_struct *hvcsd = tty->driver_data;
1423
1424        return hvcsd->chars_in_buffer;
1425}
1426
1427static const struct tty_operations hvcs_ops = {
1428        .install = hvcs_install,
1429        .open = hvcs_open,
1430        .close = hvcs_close,
1431        .cleanup = hvcs_cleanup,
1432        .hangup = hvcs_hangup,
1433        .write = hvcs_write,
1434        .write_room = hvcs_write_room,
1435        .chars_in_buffer = hvcs_chars_in_buffer,
1436        .unthrottle = hvcs_unthrottle,
1437        .throttle = hvcs_throttle,
1438};
1439
1440static int hvcs_alloc_index_list(int n)
1441{
1442        int i;
1443
1444        hvcs_index_list = kmalloc_array(n, sizeof(hvcs_index_count),
1445                                        GFP_KERNEL);
1446        if (!hvcs_index_list)
1447                return -ENOMEM;
1448        hvcs_index_count = n;
1449        for (i = 0; i < hvcs_index_count; i++)
1450                hvcs_index_list[i] = -1;
1451        return 0;
1452}
1453
1454static void hvcs_free_index_list(void)
1455{
1456        /* Paranoia check to be thorough. */
1457        kfree(hvcs_index_list);
1458        hvcs_index_list = NULL;
1459        hvcs_index_count = 0;
1460}
1461
1462static int hvcs_initialize(void)
1463{
1464        int rc, num_ttys_to_alloc;
1465
1466        mutex_lock(&hvcs_init_mutex);
1467        if (hvcs_task) {
1468                mutex_unlock(&hvcs_init_mutex);
1469                return 0;
1470        }
1471
1472        /* Has the user specified an overload with an insmod param? */
1473        if (hvcs_parm_num_devs <= 0 ||
1474                (hvcs_parm_num_devs > HVCS_MAX_SERVER_ADAPTERS)) {
1475                num_ttys_to_alloc = HVCS_DEFAULT_SERVER_ADAPTERS;
1476        } else
1477                num_ttys_to_alloc = hvcs_parm_num_devs;
1478
1479        hvcs_tty_driver = alloc_tty_driver(num_ttys_to_alloc);
1480        if (!hvcs_tty_driver) {
1481                mutex_unlock(&hvcs_init_mutex);
1482                return -ENOMEM;
1483        }
1484
1485        if (hvcs_alloc_index_list(num_ttys_to_alloc)) {
1486                rc = -ENOMEM;
1487                goto index_fail;
1488        }
1489
1490        hvcs_tty_driver->driver_name = hvcs_driver_name;
1491        hvcs_tty_driver->name = hvcs_device_node;
1492
1493        /*
1494         * We'll let the system assign us a major number, indicated by leaving
1495         * it blank.
1496         */
1497
1498        hvcs_tty_driver->minor_start = HVCS_MINOR_START;
1499        hvcs_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
1500
1501        /*
1502         * We role our own so that we DONT ECHO.  We can't echo because the
1503         * device we are connecting to already echoes by default and this would
1504         * throw us into a horrible recursive echo-echo-echo loop.
1505         */
1506        hvcs_tty_driver->init_termios = hvcs_tty_termios;
1507        hvcs_tty_driver->flags = TTY_DRIVER_REAL_RAW;
1508
1509        tty_set_operations(hvcs_tty_driver, &hvcs_ops);
1510
1511        /*
1512         * The following call will result in sysfs entries that denote the
1513         * dynamically assigned major and minor numbers for our devices.
1514         */
1515        if (tty_register_driver(hvcs_tty_driver)) {
1516                printk(KERN_ERR "HVCS: registration as a tty driver failed.\n");
1517                rc = -EIO;
1518                goto register_fail;
1519        }
1520
1521        hvcs_pi_buff = (unsigned long *) __get_free_page(GFP_KERNEL);
1522        if (!hvcs_pi_buff) {
1523                rc = -ENOMEM;
1524                goto buff_alloc_fail;
1525        }
1526
1527        hvcs_task = kthread_run(khvcsd, NULL, "khvcsd");
1528        if (IS_ERR(hvcs_task)) {
1529                printk(KERN_ERR "HVCS: khvcsd creation failed.\n");
1530                rc = -EIO;
1531                goto kthread_fail;
1532        }
1533        mutex_unlock(&hvcs_init_mutex);
1534        return 0;
1535
1536kthread_fail:
1537        free_page((unsigned long)hvcs_pi_buff);
1538buff_alloc_fail:
1539        tty_unregister_driver(hvcs_tty_driver);
1540register_fail:
1541        hvcs_free_index_list();
1542index_fail:
1543        put_tty_driver(hvcs_tty_driver);
1544        hvcs_tty_driver = NULL;
1545        mutex_unlock(&hvcs_init_mutex);
1546        return rc;
1547}
1548
1549static int __init hvcs_module_init(void)
1550{
1551        int rc = vio_register_driver(&hvcs_vio_driver);
1552        if (rc) {
1553                printk(KERN_ERR "HVCS: can't register vio driver\n");
1554                return rc;
1555        }
1556
1557        pr_info("HVCS: Driver registered.\n");
1558
1559        /* This needs to be done AFTER the vio_register_driver() call or else
1560         * the kobjects won't be initialized properly.
1561         */
1562        rc = driver_create_file(&(hvcs_vio_driver.driver), &driver_attr_rescan);
1563        if (rc)
1564                pr_warn("HVCS: Failed to create rescan file (err %d)\n", rc);
1565
1566        return 0;
1567}
1568
1569static void __exit hvcs_module_exit(void)
1570{
1571        /*
1572         * This driver receives hvcs_remove callbacks for each device upon
1573         * module removal.
1574         */
1575        vio_unregister_driver(&hvcs_vio_driver);
1576        if (!hvcs_task)
1577                return;
1578
1579        /*
1580         * This synchronous operation  will wake the khvcsd kthread if it is
1581         * asleep and will return when khvcsd has terminated.
1582         */
1583        kthread_stop(hvcs_task);
1584
1585        spin_lock(&hvcs_pi_lock);
1586        free_page((unsigned long)hvcs_pi_buff);
1587        hvcs_pi_buff = NULL;
1588        spin_unlock(&hvcs_pi_lock);
1589
1590        driver_remove_file(&hvcs_vio_driver.driver, &driver_attr_rescan);
1591
1592        tty_unregister_driver(hvcs_tty_driver);
1593
1594        hvcs_free_index_list();
1595
1596        put_tty_driver(hvcs_tty_driver);
1597
1598        printk(KERN_INFO "HVCS: driver module removed.\n");
1599}
1600
1601module_init(hvcs_module_init);
1602module_exit(hvcs_module_exit);
1603