diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/char/con3215.c | 25 | ||||
-rw-r--r-- | drivers/s390/char/sclp_tty.c | 21 | ||||
-rw-r--r-- | drivers/s390/char/sclp_vt220.c | 12 | ||||
-rw-r--r-- | drivers/s390/net/ctctty.c | 28 |
4 files changed, 25 insertions, 61 deletions
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 75419cf9d353..1f060914cfa4 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/kdev_t.h> | 17 | #include <linux/kdev_t.h> |
18 | #include <linux/tty.h> | 18 | #include <linux/tty.h> |
19 | #include <linux/tty_flip.h> | ||
19 | #include <linux/vt_kern.h> | 20 | #include <linux/vt_kern.h> |
20 | #include <linux/init.h> | 21 | #include <linux/init.h> |
21 | #include <linux/console.h> | 22 | #include <linux/console.h> |
@@ -432,8 +433,6 @@ raw3215_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) | |||
432 | if (count > slen) | 433 | if (count > slen) |
433 | count = slen; | 434 | count = slen; |
434 | } else | 435 | } else |
435 | if (count >= TTY_FLIPBUF_SIZE - tty->flip.count) | ||
436 | count = TTY_FLIPBUF_SIZE - tty->flip.count - 1; | ||
437 | EBCASC(raw->inbuf, count); | 436 | EBCASC(raw->inbuf, count); |
438 | cchar = ctrlchar_handle(raw->inbuf, count, tty); | 437 | cchar = ctrlchar_handle(raw->inbuf, count, tty); |
439 | switch (cchar & CTRLCHAR_MASK) { | 438 | switch (cchar & CTRLCHAR_MASK) { |
@@ -441,28 +440,20 @@ raw3215_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) | |||
441 | break; | 440 | break; |
442 | 441 | ||
443 | case CTRLCHAR_CTRL: | 442 | case CTRLCHAR_CTRL: |
444 | tty->flip.count++; | 443 | tty_insert_flip_char(tty, cchar, TTY_NORMAL); |
445 | *tty->flip.flag_buf_ptr++ = TTY_NORMAL; | ||
446 | *tty->flip.char_buf_ptr++ = cchar; | ||
447 | tty_flip_buffer_push(raw->tty); | 444 | tty_flip_buffer_push(raw->tty); |
448 | break; | 445 | break; |
449 | 446 | ||
450 | case CTRLCHAR_NONE: | 447 | case CTRLCHAR_NONE: |
451 | memcpy(tty->flip.char_buf_ptr, | ||
452 | raw->inbuf, count); | ||
453 | if (count < 2 || | 448 | if (count < 2 || |
454 | (strncmp(raw->inbuf+count-2, "^n", 2) && | 449 | (strncmp(raw->inbuf+count-2, "\252n", 2) && |
455 | strncmp(raw->inbuf+count-2, "\252n", 2)) ) { | 450 | strncmp(raw->inbuf+count-2, "^n", 2)) ) { |
456 | /* don't add the auto \n */ | 451 | /* add the auto \n */ |
457 | tty->flip.char_buf_ptr[count] = '\n'; | 452 | raw->inbuf[count] = '\n'; |
458 | memset(tty->flip.flag_buf_ptr, | ||
459 | TTY_NORMAL, count + 1); | ||
460 | count++; | 453 | count++; |
461 | } else | 454 | } else |
462 | count-=2; | 455 | count -= 2; |
463 | tty->flip.char_buf_ptr += count; | 456 | tty_insert_flip_string(tty, raw->inbuf, count); |
464 | tty->flip.flag_buf_ptr += count; | ||
465 | tty->flip.count += count; | ||
466 | tty_flip_buffer_push(raw->tty); | 457 | tty_flip_buffer_push(raw->tty); |
467 | break; | 458 | break; |
468 | } | 459 | } |
diff --git a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c index a20d7c89341d..6cbf067f1a8f 100644 --- a/drivers/s390/char/sclp_tty.c +++ b/drivers/s390/char/sclp_tty.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/kmod.h> | 13 | #include <linux/kmod.h> |
14 | #include <linux/tty.h> | 14 | #include <linux/tty.h> |
15 | #include <linux/tty_driver.h> | 15 | #include <linux/tty_driver.h> |
16 | #include <linux/tty_flip.h> | ||
16 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
17 | #include <linux/wait.h> | 18 | #include <linux/wait.h> |
18 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
@@ -496,25 +497,19 @@ sclp_tty_input(unsigned char* buf, unsigned int count) | |||
496 | case CTRLCHAR_SYSRQ: | 497 | case CTRLCHAR_SYSRQ: |
497 | break; | 498 | break; |
498 | case CTRLCHAR_CTRL: | 499 | case CTRLCHAR_CTRL: |
499 | sclp_tty->flip.count++; | 500 | tty_insert_flip_char(sclp_tty, cchar, TTY_NORMAL); |
500 | *sclp_tty->flip.flag_buf_ptr++ = TTY_NORMAL; | ||
501 | *sclp_tty->flip.char_buf_ptr++ = cchar; | ||
502 | tty_flip_buffer_push(sclp_tty); | 501 | tty_flip_buffer_push(sclp_tty); |
503 | break; | 502 | break; |
504 | case CTRLCHAR_NONE: | 503 | case CTRLCHAR_NONE: |
505 | /* send (normal) input to line discipline */ | 504 | /* send (normal) input to line discipline */ |
506 | memcpy(sclp_tty->flip.char_buf_ptr, buf, count); | ||
507 | if (count < 2 || | 505 | if (count < 2 || |
508 | (strncmp ((const char *) buf + count - 2, "^n", 2) && | 506 | (strncmp((const char *) buf + count - 2, "^n", 2) && |
509 | strncmp ((const char *) buf + count - 2, "\0252n", 2))) { | 507 | strncmp((const char *) buf + count - 2, "\252n", 2))) { |
510 | sclp_tty->flip.char_buf_ptr[count] = '\n'; | 508 | /* add the auto \n */ |
511 | count++; | 509 | tty_insert_flip_string(sclp_tty, buf, count); |
510 | tty_insert_flip_char(sclp_tty, '\n', TTY_NORMAL); | ||
512 | } else | 511 | } else |
513 | count -= 2; | 512 | tty_insert_flip_string(sclp_tty, buf, count - 2); |
514 | memset(sclp_tty->flip.flag_buf_ptr, TTY_NORMAL, count); | ||
515 | sclp_tty->flip.char_buf_ptr += count; | ||
516 | sclp_tty->flip.flag_buf_ptr += count; | ||
517 | sclp_tty->flip.count += count; | ||
518 | tty_flip_buffer_push(sclp_tty); | 513 | tty_flip_buffer_push(sclp_tty); |
519 | break; | 514 | break; |
520 | } | 515 | } |
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index 06bd85824d7b..9e02625c82cf 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
17 | #include <linux/tty.h> | 17 | #include <linux/tty.h> |
18 | #include <linux/tty_driver.h> | 18 | #include <linux/tty_driver.h> |
19 | #include <linux/tty_flip.h> | ||
19 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
20 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
21 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
@@ -482,16 +483,7 @@ sclp_vt220_receiver_fn(struct evbuf_header *evbuf) | |||
482 | /* Send input to line discipline */ | 483 | /* Send input to line discipline */ |
483 | buffer++; | 484 | buffer++; |
484 | count--; | 485 | count--; |
485 | /* Prevent buffer overrun by discarding input. Note that | 486 | tty_insert_flip_string(sclp_vt220_tty, buffer, count); |
486 | * because buffer_push works asynchronously, we cannot wait | ||
487 | * for the buffer to be emptied. */ | ||
488 | if (count + sclp_vt220_tty->flip.count > TTY_FLIPBUF_SIZE) | ||
489 | count = TTY_FLIPBUF_SIZE - sclp_vt220_tty->flip.count; | ||
490 | memcpy(sclp_vt220_tty->flip.char_buf_ptr, buffer, count); | ||
491 | memset(sclp_vt220_tty->flip.flag_buf_ptr, TTY_NORMAL, count); | ||
492 | sclp_vt220_tty->flip.char_buf_ptr += count; | ||
493 | sclp_vt220_tty->flip.flag_buf_ptr += count; | ||
494 | sclp_vt220_tty->flip.count += count; | ||
495 | tty_flip_buffer_push(sclp_vt220_tty); | 487 | tty_flip_buffer_push(sclp_vt220_tty); |
496 | break; | 488 | break; |
497 | } | 489 | } |
diff --git a/drivers/s390/net/ctctty.c b/drivers/s390/net/ctctty.c index 968f2c113efe..93d1725eb79b 100644 --- a/drivers/s390/net/ctctty.c +++ b/drivers/s390/net/ctctty.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/config.h> | 25 | #include <linux/config.h> |
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <linux/tty.h> | 27 | #include <linux/tty.h> |
28 | #include <linux/tty_flip.h> | ||
28 | #include <linux/serial_reg.h> | 29 | #include <linux/serial_reg.h> |
29 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
30 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
@@ -101,25 +102,17 @@ static spinlock_t ctc_tty_lock; | |||
101 | static int | 102 | static int |
102 | ctc_tty_try_read(ctc_tty_info * info, struct sk_buff *skb) | 103 | ctc_tty_try_read(ctc_tty_info * info, struct sk_buff *skb) |
103 | { | 104 | { |
104 | int c; | ||
105 | int len; | 105 | int len; |
106 | struct tty_struct *tty; | 106 | struct tty_struct *tty; |
107 | 107 | ||
108 | DBF_TEXT(trace, 5, __FUNCTION__); | 108 | DBF_TEXT(trace, 5, __FUNCTION__); |
109 | if ((tty = info->tty)) { | 109 | if ((tty = info->tty)) { |
110 | if (info->mcr & UART_MCR_RTS) { | 110 | if (info->mcr & UART_MCR_RTS) { |
111 | c = TTY_FLIPBUF_SIZE - tty->flip.count; | ||
112 | len = skb->len; | 111 | len = skb->len; |
113 | if (c >= len) { | 112 | tty_insert_flip_string(tty, skb->data, len); |
114 | memcpy(tty->flip.char_buf_ptr, skb->data, len); | 113 | tty_flip_buffer_push(tty); |
115 | memset(tty->flip.flag_buf_ptr, 0, len); | 114 | kfree_skb(skb); |
116 | tty->flip.count += len; | 115 | return 1; |
117 | tty->flip.char_buf_ptr += len; | ||
118 | tty->flip.flag_buf_ptr += len; | ||
119 | tty_flip_buffer_push(tty); | ||
120 | kfree_skb(skb); | ||
121 | return 1; | ||
122 | } | ||
123 | } | 116 | } |
124 | } | 117 | } |
125 | return 0; | 118 | return 0; |
@@ -138,19 +131,12 @@ ctc_tty_readmodem(ctc_tty_info *info) | |||
138 | DBF_TEXT(trace, 5, __FUNCTION__); | 131 | DBF_TEXT(trace, 5, __FUNCTION__); |
139 | if ((tty = info->tty)) { | 132 | if ((tty = info->tty)) { |
140 | if (info->mcr & UART_MCR_RTS) { | 133 | if (info->mcr & UART_MCR_RTS) { |
141 | int c = TTY_FLIPBUF_SIZE - tty->flip.count; | ||
142 | struct sk_buff *skb; | 134 | struct sk_buff *skb; |
143 | 135 | ||
144 | if ((c > 0) && (skb = skb_dequeue(&info->rx_queue))) { | 136 | if ((skb = skb_dequeue(&info->rx_queue))) { |
145 | int len = skb->len; | 137 | int len = skb->len; |
146 | if (len > c) | 138 | tty_insert_flip_string(tty, skb->data, len); |
147 | len = c; | ||
148 | memcpy(tty->flip.char_buf_ptr, skb->data, len); | ||
149 | skb_pull(skb, len); | 139 | skb_pull(skb, len); |
150 | memset(tty->flip.flag_buf_ptr, 0, len); | ||
151 | tty->flip.count += len; | ||
152 | tty->flip.char_buf_ptr += len; | ||
153 | tty->flip.flag_buf_ptr += len; | ||
154 | tty_flip_buffer_push(tty); | 140 | tty_flip_buffer_push(tty); |
155 | if (skb->len > 0) | 141 | if (skb->len > 0) |
156 | skb_queue_head(&info->rx_queue, skb); | 142 | skb_queue_head(&info->rx_queue, skb); |