Lines Matching refs:tp
126 static void tty3270_set_timer(struct tty3270 *tp, int expires) in tty3270_set_timer() argument
128 mod_timer(&tp->timer, jiffies + expires); in tty3270_set_timer()
135 tty3270_update_prompt(struct tty3270 *tp, char *input, int count) in tty3270_update_prompt() argument
140 line = tp->prompt; in tty3270_update_prompt()
144 line->string[5] = tp->inattr; in tty3270_update_prompt()
145 if (count > tp->view.cols * 2 - 11) in tty3270_update_prompt()
146 count = tp->view.cols * 2 - 11; in tty3270_update_prompt()
150 if (count < tp->view.cols * 2 - 11) { in tty3270_update_prompt()
153 off = tp->view.cols * tp->view.rows - 9; in tty3270_update_prompt()
154 raw3270_buffer_address(tp->view.dev, line->string+count+8, off); in tty3270_update_prompt()
158 tp->update_flags |= TTY_UPDATE_INPUT; in tty3270_update_prompt()
162 tty3270_create_prompt(struct tty3270 *tp) in tty3270_create_prompt() argument
171 line = alloc_string(&tp->freemem, in tty3270_create_prompt()
172 sizeof(blueprint) + tp->view.cols * 2 - 9); in tty3270_create_prompt()
173 tp->prompt = line; in tty3270_create_prompt()
174 tp->inattr = TF_INPUT; in tty3270_create_prompt()
179 offset = tp->view.cols * (tp->view.rows - 2); in tty3270_create_prompt()
180 raw3270_buffer_address(tp->view.dev, line->string + 1, offset); in tty3270_create_prompt()
181 offset = tp->view.cols * tp->view.rows - 9; in tty3270_create_prompt()
182 raw3270_buffer_address(tp->view.dev, line->string + 8, offset); in tty3270_create_prompt()
185 tp->input = alloc_string(&tp->freemem, tp->view.cols * 2 - 9 + 6); in tty3270_create_prompt()
193 tty3270_update_status(struct tty3270 * tp) in tty3270_update_status() argument
197 str = (tp->nr_up != 0) ? "History" : "Running"; in tty3270_update_status()
198 memcpy(tp->status->string + 8, str, 7); in tty3270_update_status()
199 codepage_convert(tp->view.ascebc, tp->status->string + 8, 7); in tty3270_update_status()
200 tp->update_flags |= TTY_UPDATE_STATUS; in tty3270_update_status()
204 tty3270_create_status(struct tty3270 * tp) in tty3270_create_status() argument
213 line = alloc_string(&tp->freemem,sizeof(blueprint)); in tty3270_create_status()
214 tp->status = line; in tty3270_create_status()
218 offset = tp->view.cols * tp->view.rows - 9; in tty3270_create_status()
219 raw3270_buffer_address(tp->view.dev, line->string + 1, offset); in tty3270_create_status()
227 tty3270_update_string(struct tty3270 *tp, struct string *line, int nr) in tty3270_update_string() argument
231 raw3270_buffer_address(tp->view.dev, line->string + 1, in tty3270_update_string()
232 tp->view.cols * nr); in tty3270_update_string()
235 raw3270_buffer_address(tp->view.dev, cp + 1, in tty3270_update_string()
236 tp->view.cols * (nr + 1)); in tty3270_update_string()
243 tty3270_rebuild_update(struct tty3270 *tp) in tty3270_rebuild_update() argument
252 list_for_each_entry_safe(s, n, &tp->update, update) in tty3270_rebuild_update()
254 line = tp->view.rows - 3; in tty3270_rebuild_update()
255 nr_up = tp->nr_up; in tty3270_rebuild_update()
256 list_for_each_entry_reverse(s, &tp->lines, list) { in tty3270_rebuild_update()
261 tty3270_update_string(tp, s, line); in tty3270_rebuild_update()
262 list_add(&s->update, &tp->update); in tty3270_rebuild_update()
266 tp->update_flags |= TTY_UPDATE_LIST; in tty3270_rebuild_update()
274 tty3270_alloc_string(struct tty3270 *tp, size_t size) in tty3270_alloc_string() argument
278 s = alloc_string(&tp->freemem, size); in tty3270_alloc_string()
281 list_for_each_entry_safe(s, n, &tp->lines, list) { in tty3270_alloc_string()
282 BUG_ON(tp->nr_lines <= tp->view.rows - 2); in tty3270_alloc_string()
286 tp->nr_lines--; in tty3270_alloc_string()
287 if (free_string(&tp->freemem, s) >= size) in tty3270_alloc_string()
290 s = alloc_string(&tp->freemem, size); in tty3270_alloc_string()
292 if (tp->nr_up != 0 && in tty3270_alloc_string()
293 tp->nr_up + tp->view.rows - 2 >= tp->nr_lines) { in tty3270_alloc_string()
294 tp->nr_up = tp->nr_lines - tp->view.rows + 2; in tty3270_alloc_string()
295 tty3270_rebuild_update(tp); in tty3270_alloc_string()
296 tty3270_update_status(tp); in tty3270_alloc_string()
305 tty3270_blank_line(struct tty3270 *tp) in tty3270_blank_line() argument
312 s = tty3270_alloc_string(tp, sizeof(blueprint)); in tty3270_blank_line()
315 list_add_tail(&s->list, &tp->lines); in tty3270_blank_line()
316 tp->nr_lines++; in tty3270_blank_line()
317 if (tp->nr_up != 0) in tty3270_blank_line()
318 tp->nr_up++; in tty3270_blank_line()
327 struct tty3270 *tp = container_of(rq->view, struct tty3270, view); in tty3270_write_callback() local
331 tp->update_flags = TTY_UPDATE_ALL; in tty3270_write_callback()
332 tty3270_set_timer(tp, 1); in tty3270_write_callback()
335 xchg(&tp->write, rq); in tty3270_write_callback()
342 tty3270_update(struct tty3270 *tp) in tty3270_update() argument
351 wrq = xchg(&tp->write, 0); in tty3270_update()
353 tty3270_set_timer(tp, 1); in tty3270_update()
357 spin_lock(&tp->view.lock); in tty3270_update()
359 if (tp->update_flags & TTY_UPDATE_ALL) { in tty3270_update()
360 tty3270_rebuild_update(tp); in tty3270_update()
361 tty3270_update_status(tp); in tty3270_update()
362 tp->update_flags = TTY_UPDATE_ERASE | TTY_UPDATE_LIST | in tty3270_update()
365 if (tp->update_flags & TTY_UPDATE_ERASE) { in tty3270_update()
372 raw3270_request_add_data(wrq, &tp->wcc, 1); in tty3270_update()
373 tp->wcc = TW_NONE; in tty3270_update()
378 if (tp->update_flags & TTY_UPDATE_STATUS) in tty3270_update()
379 if (raw3270_request_add_data(wrq, tp->status->string, in tty3270_update()
380 tp->status->len) == 0) in tty3270_update()
386 if (tp->update_flags & TTY_UPDATE_INPUT) in tty3270_update()
387 if (raw3270_request_add_data(wrq, tp->prompt->string, in tty3270_update()
388 tp->prompt->len) == 0) in tty3270_update()
393 if (tp->update_flags & TTY_UPDATE_LIST) { in tty3270_update()
395 list_for_each_entry_safe(s, n, &tp->update, update) { in tty3270_update()
410 if (list_empty(&tp->update)) in tty3270_update()
414 rc = raw3270_start(&tp->view, wrq); in tty3270_update()
416 tp->update_flags &= ~updated; in tty3270_update()
417 if (tp->update_flags) in tty3270_update()
418 tty3270_set_timer(tp, 1); in tty3270_update()
421 xchg(&tp->write, wrq); in tty3270_update()
423 spin_unlock(&tp->view.lock); in tty3270_update()
430 tty3270_rcl_add(struct tty3270 *tp, char *input, int len) in tty3270_rcl_add() argument
434 tp->rcl_walk = NULL; in tty3270_rcl_add()
437 if (tp->rcl_nr >= tp->rcl_max) { in tty3270_rcl_add()
438 s = list_entry(tp->rcl_lines.next, struct string, list); in tty3270_rcl_add()
440 free_string(&tp->freemem, s); in tty3270_rcl_add()
441 tp->rcl_nr--; in tty3270_rcl_add()
443 s = tty3270_alloc_string(tp, len); in tty3270_rcl_add()
445 list_add_tail(&s->list, &tp->rcl_lines); in tty3270_rcl_add()
446 tp->rcl_nr++; in tty3270_rcl_add()
452 struct tty3270 *tp = container_of(kbd->port, struct tty3270, port); in tty3270_rcl_backward() local
455 spin_lock_bh(&tp->view.lock); in tty3270_rcl_backward()
456 if (tp->inattr == TF_INPUT) { in tty3270_rcl_backward()
457 if (tp->rcl_walk && tp->rcl_walk->prev != &tp->rcl_lines) in tty3270_rcl_backward()
458 tp->rcl_walk = tp->rcl_walk->prev; in tty3270_rcl_backward()
459 else if (!list_empty(&tp->rcl_lines)) in tty3270_rcl_backward()
460 tp->rcl_walk = tp->rcl_lines.prev; in tty3270_rcl_backward()
461 s = tp->rcl_walk ? in tty3270_rcl_backward()
462 list_entry(tp->rcl_walk, struct string, list) : NULL; in tty3270_rcl_backward()
463 if (tp->rcl_walk) { in tty3270_rcl_backward()
464 s = list_entry(tp->rcl_walk, struct string, list); in tty3270_rcl_backward()
465 tty3270_update_prompt(tp, s->string, s->len); in tty3270_rcl_backward()
467 tty3270_update_prompt(tp, NULL, 0); in tty3270_rcl_backward()
468 tty3270_set_timer(tp, 1); in tty3270_rcl_backward()
470 spin_unlock_bh(&tp->view.lock); in tty3270_rcl_backward()
479 struct tty3270 *tp = container_of(kbd->port, struct tty3270, port); in tty3270_exit_tty() local
481 raw3270_deactivate_view(&tp->view); in tty3270_exit_tty()
490 struct tty3270 *tp = container_of(kbd->port, struct tty3270, port); in tty3270_scroll_forward() local
493 spin_lock_bh(&tp->view.lock); in tty3270_scroll_forward()
494 nr_up = tp->nr_up - tp->view.rows + 2; in tty3270_scroll_forward()
497 if (nr_up != tp->nr_up) { in tty3270_scroll_forward()
498 tp->nr_up = nr_up; in tty3270_scroll_forward()
499 tty3270_rebuild_update(tp); in tty3270_scroll_forward()
500 tty3270_update_status(tp); in tty3270_scroll_forward()
501 tty3270_set_timer(tp, 1); in tty3270_scroll_forward()
503 spin_unlock_bh(&tp->view.lock); in tty3270_scroll_forward()
512 struct tty3270 *tp = container_of(kbd->port, struct tty3270, port); in tty3270_scroll_backward() local
515 spin_lock_bh(&tp->view.lock); in tty3270_scroll_backward()
516 nr_up = tp->nr_up + tp->view.rows - 2; in tty3270_scroll_backward()
517 if (nr_up + tp->view.rows - 2 > tp->nr_lines) in tty3270_scroll_backward()
518 nr_up = tp->nr_lines - tp->view.rows + 2; in tty3270_scroll_backward()
519 if (nr_up != tp->nr_up) { in tty3270_scroll_backward()
520 tp->nr_up = nr_up; in tty3270_scroll_backward()
521 tty3270_rebuild_update(tp); in tty3270_scroll_backward()
522 tty3270_update_status(tp); in tty3270_scroll_backward()
523 tty3270_set_timer(tp, 1); in tty3270_scroll_backward()
525 spin_unlock_bh(&tp->view.lock); in tty3270_scroll_backward()
535 struct tty3270 *tp = container_of(rrq->view, struct tty3270, view); in tty3270_read_tasklet() local
539 spin_lock_bh(&tp->view.lock); in tty3270_read_tasklet()
547 if (tp->input->string[0] == 0x7d) { in tty3270_read_tasklet()
549 input = tp->input->string + 6; in tty3270_read_tasklet()
550 len = tp->input->len - 6 - rrq->rescnt; in tty3270_read_tasklet()
551 if (tp->inattr != TF_INPUTN) in tty3270_read_tasklet()
552 tty3270_rcl_add(tp, input, len); in tty3270_read_tasklet()
553 if (tp->nr_up > 0) { in tty3270_read_tasklet()
554 tp->nr_up = 0; in tty3270_read_tasklet()
555 tty3270_rebuild_update(tp); in tty3270_read_tasklet()
556 tty3270_update_status(tp); in tty3270_read_tasklet()
559 tty3270_update_prompt(tp, NULL, 0); in tty3270_read_tasklet()
560 tty3270_set_timer(tp, 1); in tty3270_read_tasklet()
561 } else if (tp->input->string[0] == 0x6d) { in tty3270_read_tasklet()
563 tp->update_flags = TTY_UPDATE_ALL; in tty3270_read_tasklet()
564 tty3270_set_timer(tp, 1); in tty3270_read_tasklet()
566 spin_unlock_bh(&tp->view.lock); in tty3270_read_tasklet()
569 raw3270_request_reset(tp->kreset); in tty3270_read_tasklet()
570 raw3270_request_set_cmd(tp->kreset, TC_WRITE); in tty3270_read_tasklet()
571 raw3270_request_add_data(tp->kreset, &kreset_data, 1); in tty3270_read_tasklet()
572 raw3270_start(&tp->view, tp->kreset); in tty3270_read_tasklet()
575 kbd_keycode(tp->kbd, *input++); in tty3270_read_tasklet()
577 kbd_keycode(tp->kbd, 256 + tp->input->string[0]); in tty3270_read_tasklet()
580 xchg(&tp->read, rrq); in tty3270_read_tasklet()
581 raw3270_put_view(&tp->view); in tty3270_read_tasklet()
590 struct tty3270 *tp = container_of(rq->view, struct tty3270, view); in tty3270_read_callback() local
593 tasklet_schedule(&tp->readlet); in tty3270_read_callback()
600 tty3270_issue_read(struct tty3270 *tp, int lock) in tty3270_issue_read() argument
605 rrq = xchg(&tp->read, 0); in tty3270_issue_read()
610 rrq->callback_data = tp; in tty3270_issue_read()
612 raw3270_request_set_data(rrq, tp->input->string, tp->input->len); in tty3270_issue_read()
615 rc = raw3270_start(&tp->view, rrq); in tty3270_issue_read()
617 rc = raw3270_start_irq(&tp->view, rrq); in tty3270_issue_read()
620 xchg(&tp->read, rrq); in tty3270_issue_read()
630 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_activate() local
632 tp->update_flags = TTY_UPDATE_ALL; in tty3270_activate()
633 tty3270_set_timer(tp, 1); in tty3270_activate()
640 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_deactivate() local
642 del_timer(&tp->timer); in tty3270_deactivate()
646 tty3270_irq(struct tty3270 *tp, struct raw3270_request *rq, struct irb *irb) in tty3270_irq() argument
650 if (!tp->throttle) in tty3270_irq()
651 tty3270_issue_read(tp, 0); in tty3270_irq()
653 tp->attn = 1; in tty3270_irq()
672 struct tty3270 *tp; in tty3270_alloc_view() local
675 tp = kzalloc(sizeof(struct tty3270), GFP_KERNEL); in tty3270_alloc_view()
676 if (!tp) in tty3270_alloc_view()
678 tp->freemem_pages = in tty3270_alloc_view()
680 if (!tp->freemem_pages) in tty3270_alloc_view()
682 INIT_LIST_HEAD(&tp->freemem); in tty3270_alloc_view()
683 INIT_LIST_HEAD(&tp->lines); in tty3270_alloc_view()
684 INIT_LIST_HEAD(&tp->update); in tty3270_alloc_view()
685 INIT_LIST_HEAD(&tp->rcl_lines); in tty3270_alloc_view()
686 tp->rcl_max = 20; in tty3270_alloc_view()
689 tp->freemem_pages[pages] = (void *) in tty3270_alloc_view()
691 if (!tp->freemem_pages[pages]) in tty3270_alloc_view()
693 add_string_memory(&tp->freemem, in tty3270_alloc_view()
694 tp->freemem_pages[pages], PAGE_SIZE); in tty3270_alloc_view()
696 tp->write = raw3270_request_alloc(TTY3270_OUTPUT_BUFFER_SIZE); in tty3270_alloc_view()
697 if (IS_ERR(tp->write)) in tty3270_alloc_view()
699 tp->read = raw3270_request_alloc(0); in tty3270_alloc_view()
700 if (IS_ERR(tp->read)) in tty3270_alloc_view()
702 tp->kreset = raw3270_request_alloc(1); in tty3270_alloc_view()
703 if (IS_ERR(tp->kreset)) in tty3270_alloc_view()
705 tp->kbd = kbd_alloc(); in tty3270_alloc_view()
706 if (!tp->kbd) in tty3270_alloc_view()
709 tty_port_init(&tp->port); in tty3270_alloc_view()
710 setup_timer(&tp->timer, (void (*)(unsigned long)) tty3270_update, in tty3270_alloc_view()
711 (unsigned long) tp); in tty3270_alloc_view()
712 tasklet_init(&tp->readlet, in tty3270_alloc_view()
714 (unsigned long) tp->read); in tty3270_alloc_view()
715 INIT_WORK(&tp->resize_work, tty3270_resize_work); in tty3270_alloc_view()
717 return tp; in tty3270_alloc_view()
720 raw3270_request_free(tp->kreset); in tty3270_alloc_view()
722 raw3270_request_free(tp->read); in tty3270_alloc_view()
724 raw3270_request_free(tp->write); in tty3270_alloc_view()
727 free_pages((unsigned long) tp->freemem_pages[pages], 0); in tty3270_alloc_view()
728 kfree(tp->freemem_pages); in tty3270_alloc_view()
729 tty_port_destroy(&tp->port); in tty3270_alloc_view()
731 kfree(tp); in tty3270_alloc_view()
740 tty3270_free_view(struct tty3270 *tp) in tty3270_free_view() argument
744 kbd_free(tp->kbd); in tty3270_free_view()
745 raw3270_request_free(tp->kreset); in tty3270_free_view()
746 raw3270_request_free(tp->read); in tty3270_free_view()
747 raw3270_request_free(tp->write); in tty3270_free_view()
749 free_pages((unsigned long) tp->freemem_pages[pages], 0); in tty3270_free_view()
750 kfree(tp->freemem_pages); in tty3270_free_view()
751 tty_port_destroy(&tp->port); in tty3270_free_view()
752 kfree(tp); in tty3270_free_view()
802 struct tty3270 *tp = container_of(work, struct tty3270, resize_work); in tty3270_resize_work() local
808 screen = tty3270_alloc_screen(tp->n_rows, tp->n_cols); in tty3270_resize_work()
812 spin_lock_bh(&tp->view.lock); in tty3270_resize_work()
813 oscreen = tp->screen; in tty3270_resize_work()
814 orows = tp->view.rows; in tty3270_resize_work()
815 tp->view.model = tp->n_model; in tty3270_resize_work()
816 tp->view.rows = tp->n_rows; in tty3270_resize_work()
817 tp->view.cols = tp->n_cols; in tty3270_resize_work()
818 tp->screen = screen; in tty3270_resize_work()
819 free_string(&tp->freemem, tp->prompt); in tty3270_resize_work()
820 free_string(&tp->freemem, tp->status); in tty3270_resize_work()
821 tty3270_create_prompt(tp); in tty3270_resize_work()
822 tty3270_create_status(tp); in tty3270_resize_work()
823 tp->nr_up = 0; in tty3270_resize_work()
824 while (tp->nr_lines < tp->view.rows - 2) in tty3270_resize_work()
825 tty3270_blank_line(tp); in tty3270_resize_work()
826 tp->update_flags = TTY_UPDATE_ALL; in tty3270_resize_work()
827 spin_unlock_bh(&tp->view.lock); in tty3270_resize_work()
829 tty3270_set_timer(tp, 1); in tty3270_resize_work()
831 tty = tty_port_tty_get(&tp->port); in tty3270_resize_work()
834 ws.ws_row = tp->view.rows - 2; in tty3270_resize_work()
835 ws.ws_col = tp->view.cols; in tty3270_resize_work()
842 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_resize() local
844 tp->n_model = model; in tty3270_resize()
845 tp->n_rows = rows; in tty3270_resize()
846 tp->n_cols = cols; in tty3270_resize()
847 schedule_work(&tp->resize_work); in tty3270_resize()
856 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_release() local
857 struct tty_struct *tty = tty_port_tty_get(&tp->port); in tty3270_release()
861 tty_port_tty_set(&tp->port, NULL); in tty3270_release()
863 raw3270_put_view(&tp->view); in tty3270_release()
874 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_free() local
876 del_timer_sync(&tp->timer); in tty3270_free()
877 tty3270_free_screen(tp->screen, tp->view.rows); in tty3270_free()
878 tty3270_free_view(tp); in tty3270_free()
911 struct tty3270 *tp; in tty3270_install() local
917 tp = container_of(view, struct tty3270, view); in tty3270_install()
918 tty->driver_data = tp; in tty3270_install()
919 tty->winsize.ws_row = tp->view.rows - 2; in tty3270_install()
920 tty->winsize.ws_col = tp->view.cols; in tty3270_install()
921 tp->port.low_latency = 0; in tty3270_install()
923 tty_port_tty_set(&tp->port, tty); in tty3270_install()
924 tp->inattr = TF_INPUT; in tty3270_install()
925 return tty_port_install(&tp->port, driver, tty); in tty3270_install()
931 tp = tty3270_alloc_view(); in tty3270_install()
932 if (IS_ERR(tp)) in tty3270_install()
933 return PTR_ERR(tp); in tty3270_install()
935 rc = raw3270_add_view(&tp->view, &tty3270_fn, in tty3270_install()
938 tty3270_free_view(tp); in tty3270_install()
942 tp->screen = tty3270_alloc_screen(tp->view.rows, tp->view.cols); in tty3270_install()
943 if (IS_ERR(tp->screen)) { in tty3270_install()
944 rc = PTR_ERR(tp->screen); in tty3270_install()
945 raw3270_put_view(&tp->view); in tty3270_install()
946 raw3270_del_view(&tp->view); in tty3270_install()
947 tty3270_free_view(tp); in tty3270_install()
951 tty_port_tty_set(&tp->port, tty); in tty3270_install()
952 tp->port.low_latency = 0; in tty3270_install()
953 tty->winsize.ws_row = tp->view.rows - 2; in tty3270_install()
954 tty->winsize.ws_col = tp->view.cols; in tty3270_install()
956 tty3270_create_prompt(tp); in tty3270_install()
957 tty3270_create_status(tp); in tty3270_install()
958 tty3270_update_status(tp); in tty3270_install()
961 for (i = 0; i < tp->view.rows - 2; i++) in tty3270_install()
962 tty3270_blank_line(tp); in tty3270_install()
964 tp->kbd->port = &tp->port; in tty3270_install()
965 tp->kbd->fn_handler[KVAL(K_INCRCONSOLE)] = tty3270_exit_tty; in tty3270_install()
966 tp->kbd->fn_handler[KVAL(K_SCROLLBACK)] = tty3270_scroll_backward; in tty3270_install()
967 tp->kbd->fn_handler[KVAL(K_SCROLLFORW)] = tty3270_scroll_forward; in tty3270_install()
968 tp->kbd->fn_handler[KVAL(K_CONS)] = tty3270_rcl_backward; in tty3270_install()
969 kbd_ascebc(tp->kbd, tp->view.ascebc); in tty3270_install()
971 raw3270_activate_view(&tp->view); in tty3270_install()
973 rc = tty_port_install(&tp->port, driver, tty); in tty3270_install()
975 raw3270_put_view(&tp->view); in tty3270_install()
979 tty->driver_data = tp; in tty3270_install()
990 struct tty3270 *tp = tty->driver_data; in tty3270_open() local
991 struct tty_port *port = &tp->port; in tty3270_open()
1005 struct tty3270 *tp = tty->driver_data; in tty3270_close() local
1009 if (tp) { in tty3270_close()
1011 tty_port_tty_set(&tp->port, NULL); in tty3270_close()
1017 struct tty3270 *tp = tty->driver_data; in tty3270_cleanup() local
1019 if (tp) in tty3270_cleanup()
1020 raw3270_put_view(&tp->view); in tty3270_cleanup()
1036 static void tty3270_put_character(struct tty3270 *tp, char ch) in tty3270_put_character() argument
1041 line = tp->screen + tp->cy; in tty3270_put_character()
1042 if (line->len <= tp->cx) { in tty3270_put_character()
1043 while (line->len < tp->cx) { in tty3270_put_character()
1045 cell->character = tp->view.ascebc[' ']; in tty3270_put_character()
1046 cell->highlight = tp->highlight; in tty3270_put_character()
1047 cell->f_color = tp->f_color; in tty3270_put_character()
1052 cell = line->cells + tp->cx; in tty3270_put_character()
1053 cell->character = tp->view.ascebc[(unsigned int) ch]; in tty3270_put_character()
1054 cell->highlight = tp->highlight; in tty3270_put_character()
1055 cell->f_color = tp->f_color; in tty3270_put_character()
1062 tty3270_convert_line(struct tty3270 *tp, int line_nr) in tty3270_convert_line() argument
1074 line = tp->screen + line_nr; in tty3270_convert_line()
1092 if (line->len < tp->view.cols) in tty3270_convert_line()
1096 i = tp->view.rows - 2 - line_nr; in tty3270_convert_line()
1097 list_for_each_entry_reverse(s, &tp->lines, list) in tty3270_convert_line()
1105 n = tty3270_alloc_string(tp, flen); in tty3270_convert_line()
1110 free_string(&tp->freemem, s); in tty3270_convert_line()
1147 if (line->len < tp->view.cols) { in tty3270_convert_line()
1154 if (tp->nr_up + line_nr < tp->view.rows - 2) { in tty3270_convert_line()
1156 tty3270_update_string(tp, s, line_nr); in tty3270_convert_line()
1159 list_add_tail(&s->update, &tp->update); in tty3270_convert_line()
1160 tp->update_flags |= TTY_UPDATE_LIST; in tty3270_convert_line()
1169 tty3270_cr(struct tty3270 *tp) in tty3270_cr() argument
1171 tp->cx = 0; in tty3270_cr()
1178 tty3270_lf(struct tty3270 *tp) in tty3270_lf() argument
1183 tty3270_convert_line(tp, tp->cy); in tty3270_lf()
1184 if (tp->cy < tp->view.rows - 3) { in tty3270_lf()
1185 tp->cy++; in tty3270_lf()
1189 tty3270_blank_line(tp); in tty3270_lf()
1190 temp = tp->screen[0]; in tty3270_lf()
1192 for (i = 0; i < tp->view.rows - 3; i++) in tty3270_lf()
1193 tp->screen[i] = tp->screen[i+1]; in tty3270_lf()
1194 tp->screen[tp->view.rows - 3] = temp; in tty3270_lf()
1195 tty3270_rebuild_update(tp); in tty3270_lf()
1199 tty3270_ri(struct tty3270 *tp) in tty3270_ri() argument
1201 if (tp->cy > 0) { in tty3270_ri()
1202 tty3270_convert_line(tp, tp->cy); in tty3270_ri()
1203 tp->cy--; in tty3270_ri()
1211 tty3270_insert_characters(struct tty3270 *tp, int n) in tty3270_insert_characters() argument
1216 line = tp->screen + tp->cy; in tty3270_insert_characters()
1217 while (line->len < tp->cx) { in tty3270_insert_characters()
1218 line->cells[line->len].character = tp->view.ascebc[' ']; in tty3270_insert_characters()
1223 if (n > tp->view.cols - tp->cx) in tty3270_insert_characters()
1224 n = tp->view.cols - tp->cx; in tty3270_insert_characters()
1225 k = min_t(int, line->len - tp->cx, tp->view.cols - tp->cx - n); in tty3270_insert_characters()
1227 line->cells[tp->cx + n + k] = line->cells[tp->cx + k]; in tty3270_insert_characters()
1229 if (line->len > tp->view.cols) in tty3270_insert_characters()
1230 line->len = tp->view.cols; in tty3270_insert_characters()
1232 line->cells[tp->cx + n].character = tp->view.ascebc[' ']; in tty3270_insert_characters()
1233 line->cells[tp->cx + n].highlight = tp->highlight; in tty3270_insert_characters()
1234 line->cells[tp->cx + n].f_color = tp->f_color; in tty3270_insert_characters()
1242 tty3270_delete_characters(struct tty3270 *tp, int n) in tty3270_delete_characters() argument
1247 line = tp->screen + tp->cy; in tty3270_delete_characters()
1248 if (line->len <= tp->cx) in tty3270_delete_characters()
1250 if (line->len - tp->cx <= n) { in tty3270_delete_characters()
1251 line->len = tp->cx; in tty3270_delete_characters()
1254 for (i = tp->cx; i + n < line->len; i++) in tty3270_delete_characters()
1263 tty3270_erase_characters(struct tty3270 *tp, int n) in tty3270_erase_characters() argument
1268 line = tp->screen + tp->cy; in tty3270_erase_characters()
1269 while (line->len > tp->cx && n-- > 0) { in tty3270_erase_characters()
1270 cell = line->cells + tp->cx++; in tty3270_erase_characters()
1275 tp->cx += n; in tty3270_erase_characters()
1276 tp->cx = min_t(int, tp->cx, tp->view.cols - 1); in tty3270_erase_characters()
1286 tty3270_erase_line(struct tty3270 *tp, int mode) in tty3270_erase_line() argument
1292 line = tp->screen + tp->cy; in tty3270_erase_line()
1294 line->len = tp->cx; in tty3270_erase_line()
1296 for (i = 0; i < tp->cx; i++) { in tty3270_erase_line()
1302 if (line->len <= tp->cx) in tty3270_erase_line()
1303 line->len = tp->cx + 1; in tty3270_erase_line()
1306 tty3270_convert_line(tp, tp->cy); in tty3270_erase_line()
1316 tty3270_erase_display(struct tty3270 *tp, int mode) in tty3270_erase_display() argument
1321 tty3270_erase_line(tp, 0); in tty3270_erase_display()
1322 for (i = tp->cy + 1; i < tp->view.rows - 2; i++) { in tty3270_erase_display()
1323 tp->screen[i].len = 0; in tty3270_erase_display()
1324 tty3270_convert_line(tp, i); in tty3270_erase_display()
1327 for (i = 0; i < tp->cy; i++) { in tty3270_erase_display()
1328 tp->screen[i].len = 0; in tty3270_erase_display()
1329 tty3270_convert_line(tp, i); in tty3270_erase_display()
1331 tty3270_erase_line(tp, 1); in tty3270_erase_display()
1333 for (i = 0; i < tp->view.rows - 2; i++) { in tty3270_erase_display()
1334 tp->screen[i].len = 0; in tty3270_erase_display()
1335 tty3270_convert_line(tp, i); in tty3270_erase_display()
1338 tty3270_rebuild_update(tp); in tty3270_erase_display()
1346 tty3270_set_attributes(struct tty3270 *tp) in tty3270_set_attributes() argument
1354 for (i = 0; i <= tp->esc_npar; i++) { in tty3270_set_attributes()
1355 attr = tp->esc_par[i]; in tty3270_set_attributes()
1358 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1359 tp->f_color = TAC_RESET; in tty3270_set_attributes()
1363 tp->highlight = TAX_UNDER; in tty3270_set_attributes()
1366 tp->highlight = TAX_BLINK; in tty3270_set_attributes()
1369 tp->highlight = TAX_REVER; in tty3270_set_attributes()
1372 if (tp->highlight == TAX_UNDER) in tty3270_set_attributes()
1373 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1376 if (tp->highlight == TAX_BLINK) in tty3270_set_attributes()
1377 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1380 if (tp->highlight == TAX_REVER) in tty3270_set_attributes()
1381 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1393 tp->f_color = f_colors[attr - 30]; in tty3270_set_attributes()
1400 tty3270_getpar(struct tty3270 *tp, int ix) in tty3270_getpar() argument
1402 return (tp->esc_par[ix] > 0) ? tp->esc_par[ix] : 1; in tty3270_getpar()
1406 tty3270_goto_xy(struct tty3270 *tp, int cx, int cy) in tty3270_goto_xy() argument
1411 tp->cx = min_t(int, tp->view.cols - 1, max_cx); in tty3270_goto_xy()
1412 cy = min_t(int, tp->view.rows - 3, max_cy); in tty3270_goto_xy()
1413 if (cy != tp->cy) { in tty3270_goto_xy()
1414 tty3270_convert_line(tp, tp->cy); in tty3270_goto_xy()
1415 tp->cy = cy; in tty3270_goto_xy()
1440 tty3270_escape_sequence(struct tty3270 *tp, char ch) in tty3270_escape_sequence() argument
1444 if (tp->esc_state == ESnormal) { in tty3270_escape_sequence()
1447 tp->esc_state = ESesc; in tty3270_escape_sequence()
1450 if (tp->esc_state == ESesc) { in tty3270_escape_sequence()
1451 tp->esc_state = ESnormal; in tty3270_escape_sequence()
1454 tp->esc_state = ESsquare; in tty3270_escape_sequence()
1457 tty3270_cr(tp); in tty3270_escape_sequence()
1458 tty3270_lf(tp); in tty3270_escape_sequence()
1461 tty3270_ri(tp); in tty3270_escape_sequence()
1464 tty3270_lf(tp); in tty3270_escape_sequence()
1467 kbd_puts_queue(&tp->port, "\033[?6c"); in tty3270_escape_sequence()
1470 tp->saved_cx = tp->cx; in tty3270_escape_sequence()
1471 tp->saved_cy = tp->cy; in tty3270_escape_sequence()
1472 tp->saved_highlight = tp->highlight; in tty3270_escape_sequence()
1473 tp->saved_f_color = tp->f_color; in tty3270_escape_sequence()
1476 tty3270_convert_line(tp, tp->cy); in tty3270_escape_sequence()
1477 tty3270_goto_xy(tp, tp->saved_cx, tp->saved_cy); in tty3270_escape_sequence()
1478 tp->highlight = tp->saved_highlight; in tty3270_escape_sequence()
1479 tp->f_color = tp->saved_f_color; in tty3270_escape_sequence()
1482 tp->cx = tp->saved_cx = 0; in tty3270_escape_sequence()
1483 tp->cy = tp->saved_cy = 0; in tty3270_escape_sequence()
1484 tp->highlight = tp->saved_highlight = TAX_RESET; in tty3270_escape_sequence()
1485 tp->f_color = tp->saved_f_color = TAC_RESET; in tty3270_escape_sequence()
1486 tty3270_erase_display(tp, 2); in tty3270_escape_sequence()
1491 if (tp->esc_state == ESsquare) { in tty3270_escape_sequence()
1492 tp->esc_state = ESgetpars; in tty3270_escape_sequence()
1493 memset(tp->esc_par, 0, sizeof(tp->esc_par)); in tty3270_escape_sequence()
1494 tp->esc_npar = 0; in tty3270_escape_sequence()
1495 tp->esc_ques = (ch == '?'); in tty3270_escape_sequence()
1496 if (tp->esc_ques) in tty3270_escape_sequence()
1499 if (tp->esc_state == ESgetpars) { in tty3270_escape_sequence()
1500 if (ch == ';' && tp->esc_npar < ESCAPE_NPAR - 1) { in tty3270_escape_sequence()
1501 tp->esc_npar++; in tty3270_escape_sequence()
1505 tp->esc_par[tp->esc_npar] *= 10; in tty3270_escape_sequence()
1506 tp->esc_par[tp->esc_npar] += ch - '0'; in tty3270_escape_sequence()
1510 tp->esc_state = ESnormal; in tty3270_escape_sequence()
1511 if (ch == 'n' && !tp->esc_ques) { in tty3270_escape_sequence()
1512 if (tp->esc_par[0] == 5) /* Status report. */ in tty3270_escape_sequence()
1513 kbd_puts_queue(&tp->port, "\033[0n"); in tty3270_escape_sequence()
1514 else if (tp->esc_par[0] == 6) { /* Cursor report. */ in tty3270_escape_sequence()
1516 sprintf(buf, "\033[%d;%dR", tp->cy + 1, tp->cx + 1); in tty3270_escape_sequence()
1517 kbd_puts_queue(&tp->port, buf); in tty3270_escape_sequence()
1521 if (tp->esc_ques) in tty3270_escape_sequence()
1525 tty3270_set_attributes(tp); in tty3270_escape_sequence()
1529 tty3270_goto_xy(tp, tty3270_getpar(tp, 1) - 1, in tty3270_escape_sequence()
1530 tty3270_getpar(tp, 0) - 1); in tty3270_escape_sequence()
1533 tty3270_goto_xy(tp, tp->cx, tty3270_getpar(tp, 0) - 1); in tty3270_escape_sequence()
1537 tty3270_goto_xy(tp, tp->cx, tp->cy - tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1542 tty3270_goto_xy(tp, tp->cx, tp->cy + tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1546 tty3270_goto_xy(tp, tp->cx + tty3270_getpar(tp, 0), tp->cy); in tty3270_escape_sequence()
1549 tty3270_goto_xy(tp, tp->cx - tty3270_getpar(tp, 0), tp->cy); in tty3270_escape_sequence()
1553 tty3270_goto_xy(tp, tty3270_getpar(tp, 0), tp->cy); in tty3270_escape_sequence()
1556 tty3270_erase_characters(tp, tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1559 tty3270_erase_display(tp, tp->esc_par[0]); in tty3270_escape_sequence()
1562 tty3270_erase_line(tp, tp->esc_par[0]); in tty3270_escape_sequence()
1565 tty3270_delete_characters(tp, tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1568 tty3270_insert_characters(tp, tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1571 tp->saved_cx = tp->cx; in tty3270_escape_sequence()
1572 tp->saved_cy = tp->cy; in tty3270_escape_sequence()
1573 tp->saved_highlight = tp->highlight; in tty3270_escape_sequence()
1574 tp->saved_f_color = tp->f_color; in tty3270_escape_sequence()
1577 tty3270_convert_line(tp, tp->cy); in tty3270_escape_sequence()
1578 tty3270_goto_xy(tp, tp->saved_cx, tp->saved_cy); in tty3270_escape_sequence()
1579 tp->highlight = tp->saved_highlight; in tty3270_escape_sequence()
1580 tp->f_color = tp->saved_f_color; in tty3270_escape_sequence()
1589 tty3270_do_write(struct tty3270 *tp, struct tty_struct *tty, in tty3270_do_write() argument
1594 spin_lock_bh(&tp->view.lock); in tty3270_do_write()
1596 if (tp->esc_state != 0) { in tty3270_do_write()
1598 tty3270_escape_sequence(tp, buf[i_msg]); in tty3270_do_write()
1604 tp->wcc |= TW_PLUSALARM; in tty3270_do_write()
1607 if (tp->cx > 0) { in tty3270_do_write()
1608 tp->cx--; in tty3270_do_write()
1609 tty3270_put_character(tp, ' '); in tty3270_do_write()
1613 for (i = tp->cx % 8; i < 8; i++) { in tty3270_do_write()
1614 if (tp->cx >= tp->view.cols) { in tty3270_do_write()
1615 tty3270_cr(tp); in tty3270_do_write()
1616 tty3270_lf(tp); in tty3270_do_write()
1619 tty3270_put_character(tp, ' '); in tty3270_do_write()
1620 tp->cx++; in tty3270_do_write()
1624 tty3270_cr(tp); in tty3270_do_write()
1625 tty3270_lf(tp); in tty3270_do_write()
1628 tty3270_erase_display(tp, 2); in tty3270_do_write()
1629 tp->cx = tp->cy = 0; in tty3270_do_write()
1632 tp->cx = 0; in tty3270_do_write()
1637 tty3270_escape_sequence(tp, buf[i_msg]); in tty3270_do_write()
1640 if (tp->cx >= tp->view.cols) { in tty3270_do_write()
1641 tty3270_cr(tp); in tty3270_do_write()
1642 tty3270_lf(tp); in tty3270_do_write()
1644 tty3270_put_character(tp, buf[i_msg]); in tty3270_do_write()
1645 tp->cx++; in tty3270_do_write()
1650 tty3270_convert_line(tp, tp->cy); in tty3270_do_write()
1653 if (!timer_pending(&tp->timer)) in tty3270_do_write()
1654 tty3270_set_timer(tp, HZ/10); in tty3270_do_write()
1656 spin_unlock_bh(&tp->view.lock); in tty3270_do_write()
1666 struct tty3270 *tp; in tty3270_write() local
1668 tp = tty->driver_data; in tty3270_write()
1669 if (!tp) in tty3270_write()
1671 if (tp->char_count > 0) { in tty3270_write()
1672 tty3270_do_write(tp, tty, tp->char_buf, tp->char_count); in tty3270_write()
1673 tp->char_count = 0; in tty3270_write()
1675 tty3270_do_write(tp, tty, buf, count); in tty3270_write()
1684 struct tty3270 *tp; in tty3270_put_char() local
1686 tp = tty->driver_data; in tty3270_put_char()
1687 if (!tp || tp->char_count >= TTY3270_CHAR_BUF_SIZE) in tty3270_put_char()
1689 tp->char_buf[tp->char_count++] = ch; in tty3270_put_char()
1700 struct tty3270 *tp; in tty3270_flush_chars() local
1702 tp = tty->driver_data; in tty3270_flush_chars()
1703 if (!tp) in tty3270_flush_chars()
1705 if (tp->char_count > 0) { in tty3270_flush_chars()
1706 tty3270_do_write(tp, tty, tp->char_buf, tp->char_count); in tty3270_flush_chars()
1707 tp->char_count = 0; in tty3270_flush_chars()
1733 struct tty3270 *tp; in tty3270_set_termios() local
1736 tp = tty->driver_data; in tty3270_set_termios()
1737 if (!tp) in tty3270_set_termios()
1739 spin_lock_bh(&tp->view.lock); in tty3270_set_termios()
1742 if (new != tp->inattr) { in tty3270_set_termios()
1743 tp->inattr = new; in tty3270_set_termios()
1744 tty3270_update_prompt(tp, NULL, 0); in tty3270_set_termios()
1745 tty3270_set_timer(tp, 1); in tty3270_set_termios()
1748 spin_unlock_bh(&tp->view.lock); in tty3270_set_termios()
1757 struct tty3270 *tp; in tty3270_throttle() local
1759 tp = tty->driver_data; in tty3270_throttle()
1760 if (!tp) in tty3270_throttle()
1762 tp->throttle = 1; in tty3270_throttle()
1771 struct tty3270 *tp; in tty3270_unthrottle() local
1773 tp = tty->driver_data; in tty3270_unthrottle()
1774 if (!tp) in tty3270_unthrottle()
1776 tp->throttle = 0; in tty3270_unthrottle()
1777 if (tp->attn) in tty3270_unthrottle()
1778 tty3270_issue_read(tp, 1); in tty3270_unthrottle()
1798 struct tty3270 *tp; in tty3270_ioctl() local
1800 tp = tty->driver_data; in tty3270_ioctl()
1801 if (!tp) in tty3270_ioctl()
1805 return kbd_ioctl(tp->kbd, cmd, arg); in tty3270_ioctl()
1812 struct tty3270 *tp; in tty3270_compat_ioctl() local
1814 tp = tty->driver_data; in tty3270_compat_ioctl()
1815 if (!tp) in tty3270_compat_ioctl()
1819 return kbd_ioctl(tp->kbd, cmd, (unsigned long)compat_ptr(arg)); in tty3270_compat_ioctl()