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