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