diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-04-30 11:10:12 -0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-04-30 11:10:12 -0400 | 
| commit | 24a77daf3d80bddcece044e6dc3675e427eef3f3 (patch) | |
| tree | 2c5e0b0bea394d6fe62c5d5857c252e83e48ac48 /drivers/char/hvc_console.c | |
| parent | e389f9aec689209724105ae80a6c91fd2e747bc9 (diff) | |
| parent | f900e9777fc9b65140cb9570438597bc8fae56ab (diff) | |
Merge branch 'for-2.6.22' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'for-2.6.22' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (255 commits)
  [POWERPC] Remove dev_dbg redefinition in drivers/ps3/vuart.c
  [POWERPC] remove kernel module option for booke wdt
  [POWERPC] Avoid putting cpu node twice
  [POWERPC] Spinlock initializer cleanup
  [POWERPC] ppc4xx_sgdma needs dma-mapping.h
  [POWERPC] arch/powerpc/sysdev/timer.c build fix
  [POWERPC] get_property cleanups
  [POWERPC] Remove the unused HTDMSOUND driver
  [POWERPC] cell: cbe_cpufreq cleanup and crash fix
  [POWERPC] Declare enable_kernel_spe in a header
  [POWERPC] Add dt_xlate_addr() to bootwrapper
  [POWERPC] bootwrapper: CONFIG_ -> CONFIG_DEVICE_TREE
  [POWERPC] Don't define a custom bd_t for Xilixn Virtex based boards.
  [POWERPC] Add sane defaults for Xilinx EDK generated xparameters files
  [POWERPC] Add uartlite boot console driver for the zImage wrapper
  [POWERPC] Stop using ppc_sys for Xilinx Virtex boards
  [POWERPC] New registration for common Xilinx Virtex ppc405 platform devices
  [POWERPC] Merge common virtex header files
  [POWERPC] Rework Kconfig dependancies for Xilinx Virtex ppc405 platform
  [POWERPC] Clean up cpufreq Kconfig dependencies
  ...
Diffstat (limited to 'drivers/char/hvc_console.c')
| -rw-r--r-- | drivers/char/hvc_console.c | 49 | 
1 files changed, 34 insertions, 15 deletions
| diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index a0a88aa23f5b..0f9ed7b46a6d 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c | |||
| @@ -47,8 +47,6 @@ | |||
| 47 | #define HVC_MAJOR 229 | 47 | #define HVC_MAJOR 229 | 
| 48 | #define HVC_MINOR 0 | 48 | #define HVC_MINOR 0 | 
| 49 | 49 | ||
| 50 | #define TIMEOUT (10) | ||
| 51 | |||
| 52 | /* | 50 | /* | 
| 53 | * Wait this long per iteration while trying to push buffered data to the | 51 | * Wait this long per iteration while trying to push buffered data to the | 
| 54 | * hypervisor before allowing the tty to complete a close operation. | 52 | * hypervisor before allowing the tty to complete a close operation. | 
| @@ -104,12 +102,12 @@ static DEFINE_SPINLOCK(hvc_structs_lock); | |||
| 104 | /* | 102 | /* | 
| 105 | * This value is used to assign a tty->index value to a hvc_struct based | 103 | * 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 | 104 | * upon order of exposure via hvc_probe(), when we can not match it to | 
| 107 | * a console canidate registered with hvc_instantiate(). | 105 | * a console candidate registered with hvc_instantiate(). | 
| 108 | */ | 106 | */ | 
| 109 | static int last_hvc = -1; | 107 | static int last_hvc = -1; | 
| 110 | 108 | ||
| 111 | /* | 109 | /* | 
| 112 | * Do not call this function with either the hvc_strucst_lock or the hvc_struct | 110 | * Do not call this function with either the hvc_structs_lock or the hvc_struct | 
| 113 | * lock held. If successful, this function increments the kobject reference | 111 | * lock held. If successful, this function increments the kobject reference | 
| 114 | * count against the target hvc_struct so it should be released when finished. | 112 | * count against the target hvc_struct so it should be released when finished. | 
| 115 | */ | 113 | */ | 
| @@ -162,7 +160,7 @@ void hvc_console_print(struct console *co, const char *b, unsigned count) | |||
| 162 | if (index >= MAX_NR_HVC_CONSOLES) | 160 | if (index >= MAX_NR_HVC_CONSOLES) | 
| 163 | return; | 161 | return; | 
| 164 | 162 | ||
| 165 | /* This console adapter was removed so it is not useable. */ | 163 | /* This console adapter was removed so it is not usable. */ | 
| 166 | if (vtermnos[index] < 0) | 164 | if (vtermnos[index] < 0) | 
| 167 | return; | 165 | return; | 
| 168 | 166 | ||
| @@ -220,7 +218,7 @@ struct console hvc_con_driver = { | |||
| 220 | }; | 218 | }; | 
| 221 | 219 | ||
| 222 | /* | 220 | /* | 
| 223 | * Early console initialization. Preceeds driver initialization. | 221 | * Early console initialization. Precedes driver initialization. | 
| 224 | * | 222 | * | 
| 225 | * (1) we are first, and the user specified another driver | 223 | * (1) we are first, and the user specified another driver | 
| 226 | * -- index will remain -1 | 224 | * -- index will remain -1 | 
| @@ -257,7 +255,7 @@ int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops) | |||
| 257 | if (vtermnos[index] != -1) | 255 | if (vtermnos[index] != -1) | 
| 258 | return -1; | 256 | return -1; | 
| 259 | 257 | ||
| 260 | /* make sure no no tty has been registerd in this index */ | 258 | /* make sure no no tty has been registered in this index */ | 
| 261 | hp = hvc_get_by_index(index); | 259 | hp = hvc_get_by_index(index); | 
| 262 | if (hp) { | 260 | if (hp) { | 
| 263 | kobject_put(&hp->kobj); | 261 | kobject_put(&hp->kobj); | 
| @@ -267,7 +265,7 @@ int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops) | |||
| 267 | vtermnos[index] = vtermno; | 265 | vtermnos[index] = vtermno; | 
| 268 | cons_ops[index] = ops; | 266 | cons_ops[index] = ops; | 
| 269 | 267 | ||
| 270 | /* reserve all indices upto and including this index */ | 268 | /* reserve all indices up to and including this index */ | 
| 271 | if (last_hvc < index) | 269 | if (last_hvc < index) | 
| 272 | last_hvc = index; | 270 | last_hvc = index; | 
| 273 | 271 | ||
| @@ -528,7 +526,7 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count | |||
| 528 | 526 | ||
| 529 | /* | 527 | /* | 
| 530 | * This is actually a contract between the driver and the tty layer outlining | 528 | * This is actually a contract between the driver and the tty layer outlining | 
| 531 | * how much write room the driver can guarentee will be sent OR BUFFERED. This | 529 | * how much write room the driver can guarantee will be sent OR BUFFERED. This | 
| 532 | * driver MUST honor the return value. | 530 | * driver MUST honor the return value. | 
| 533 | */ | 531 | */ | 
| 534 | static int hvc_write_room(struct tty_struct *tty) | 532 | static int hvc_write_room(struct tty_struct *tty) | 
| @@ -550,6 +548,18 @@ static int hvc_chars_in_buffer(struct tty_struct *tty) | |||
| 550 | return hp->n_outbuf; | 548 | return hp->n_outbuf; | 
| 551 | } | 549 | } | 
| 552 | 550 | ||
| 551 | /* | ||
| 552 | * timeout will vary between the MIN and MAX values defined here. By default | ||
| 553 | * and during console activity we will use a default MIN_TIMEOUT of 10. When | ||
| 554 | * the console is idle, we increase the timeout value on each pass through | ||
| 555 | * msleep until we reach the max. This may be noticeable as a brief (average | ||
| 556 | * one second) delay on the console before the console responds to input when | ||
| 557 | * there has been no input for some time. | ||
| 558 | */ | ||
| 559 | #define MIN_TIMEOUT (10) | ||
| 560 | #define MAX_TIMEOUT (2000) | ||
| 561 | static u32 timeout = MIN_TIMEOUT; | ||
| 562 | |||
| 553 | #define HVC_POLL_READ 0x00000001 | 563 | #define HVC_POLL_READ 0x00000001 | 
| 554 | #define HVC_POLL_WRITE 0x00000002 | 564 | #define HVC_POLL_WRITE 0x00000002 | 
| 555 | 565 | ||
| @@ -642,9 +652,14 @@ static int hvc_poll(struct hvc_struct *hp) | |||
| 642 | bail: | 652 | bail: | 
| 643 | spin_unlock_irqrestore(&hp->lock, flags); | 653 | spin_unlock_irqrestore(&hp->lock, flags); | 
| 644 | 654 | ||
| 645 | if (read_total) | 655 | if (read_total) { | 
| 656 | /* Activity is occurring, so reset the polling backoff value to | ||
| 657 | a minimum for performance. */ | ||
| 658 | timeout = MIN_TIMEOUT; | ||
| 659 | |||
| 646 | tty_flip_buffer_push(tty); | 660 | tty_flip_buffer_push(tty); | 
| 647 | 661 | } | |
| 662 | |||
| 648 | return poll_mask; | 663 | return poll_mask; | 
| 649 | } | 664 | } | 
| 650 | 665 | ||
| @@ -688,8 +703,12 @@ int khvcd(void *unused) | |||
| 688 | if (!hvc_kicked) { | 703 | if (!hvc_kicked) { | 
| 689 | if (poll_mask == 0) | 704 | if (poll_mask == 0) | 
| 690 | schedule(); | 705 | schedule(); | 
| 691 | else | 706 | else { | 
| 692 | msleep_interruptible(TIMEOUT); | 707 | if (timeout < MAX_TIMEOUT) | 
| 708 | timeout += (timeout >> 6) + 1; | ||
| 709 | |||
| 710 | msleep_interruptible(timeout); | ||
| 711 | } | ||
| 693 | } | 712 | } | 
| 694 | __set_current_state(TASK_RUNNING); | 713 | __set_current_state(TASK_RUNNING); | 
| 695 | } while (!kthread_should_stop()); | 714 | } while (!kthread_should_stop()); | 
| @@ -794,7 +813,7 @@ int __devexit hvc_remove(struct hvc_struct *hp) | |||
| 794 | 813 | ||
| 795 | /* | 814 | /* | 
| 796 | * We 'put' the instance that was grabbed when the kobject instance | 815 | * We 'put' the instance that was grabbed when the kobject instance | 
| 797 | * was intialized using kobject_init(). Let the last holder of this | 816 | * was initialized using kobject_init(). Let the last holder of this | 
| 798 | * kobject cause it to be removed, which will probably be the tty_hangup | 817 | * kobject cause it to be removed, which will probably be the tty_hangup | 
| 799 | * below. | 818 | * below. | 
| 800 | */ | 819 | */ | 
| @@ -850,7 +869,7 @@ int __init hvc_init(void) | |||
| 850 | } | 869 | } | 
| 851 | module_init(hvc_init); | 870 | module_init(hvc_init); | 
| 852 | 871 | ||
| 853 | /* This isn't particularily necessary due to this being a console driver | 872 | /* This isn't particularly necessary due to this being a console driver | 
| 854 | * but it is nice to be thorough. | 873 | * but it is nice to be thorough. | 
| 855 | */ | 874 | */ | 
| 856 | static void __exit hvc_exit(void) | 875 | static void __exit hvc_exit(void) | 
