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()
664 tp->update_flags = TTY_UPDATE_ALL; in tty3270_irq()
665 tty3270_set_timer(tp, 1); in tty3270_irq()
676 struct tty3270 *tp; in tty3270_alloc_view() local
679 tp = kzalloc(sizeof(struct tty3270), GFP_KERNEL); in tty3270_alloc_view()
680 if (!tp) in tty3270_alloc_view()
682 tp->freemem_pages = in tty3270_alloc_view()
684 if (!tp->freemem_pages) in tty3270_alloc_view()
686 INIT_LIST_HEAD(&tp->freemem); in tty3270_alloc_view()
687 INIT_LIST_HEAD(&tp->lines); in tty3270_alloc_view()
688 INIT_LIST_HEAD(&tp->update); in tty3270_alloc_view()
689 INIT_LIST_HEAD(&tp->rcl_lines); in tty3270_alloc_view()
690 tp->rcl_max = 20; in tty3270_alloc_view()
693 tp->freemem_pages[pages] = (void *) in tty3270_alloc_view()
695 if (!tp->freemem_pages[pages]) in tty3270_alloc_view()
697 add_string_memory(&tp->freemem, in tty3270_alloc_view()
698 tp->freemem_pages[pages], PAGE_SIZE); in tty3270_alloc_view()
700 tp->write = raw3270_request_alloc(TTY3270_OUTPUT_BUFFER_SIZE); in tty3270_alloc_view()
701 if (IS_ERR(tp->write)) in tty3270_alloc_view()
703 tp->read = raw3270_request_alloc(0); in tty3270_alloc_view()
704 if (IS_ERR(tp->read)) in tty3270_alloc_view()
706 tp->kreset = raw3270_request_alloc(1); in tty3270_alloc_view()
707 if (IS_ERR(tp->kreset)) in tty3270_alloc_view()
709 tp->kbd = kbd_alloc(); in tty3270_alloc_view()
710 if (!tp->kbd) in tty3270_alloc_view()
713 tty_port_init(&tp->port); in tty3270_alloc_view()
714 setup_timer(&tp->timer, (void (*)(unsigned long)) tty3270_update, in tty3270_alloc_view()
715 (unsigned long) tp); in tty3270_alloc_view()
716 tasklet_init(&tp->readlet, in tty3270_alloc_view()
718 (unsigned long) tp->read); in tty3270_alloc_view()
719 INIT_WORK(&tp->resize_work, tty3270_resize_work); in tty3270_alloc_view()
721 return tp; in tty3270_alloc_view()
724 raw3270_request_free(tp->kreset); in tty3270_alloc_view()
726 raw3270_request_free(tp->read); in tty3270_alloc_view()
728 raw3270_request_free(tp->write); in tty3270_alloc_view()
731 free_pages((unsigned long) tp->freemem_pages[pages], 0); in tty3270_alloc_view()
732 kfree(tp->freemem_pages); in tty3270_alloc_view()
733 tty_port_destroy(&tp->port); in tty3270_alloc_view()
735 kfree(tp); in tty3270_alloc_view()
744 tty3270_free_view(struct tty3270 *tp) in tty3270_free_view() argument
748 kbd_free(tp->kbd); in tty3270_free_view()
749 raw3270_request_free(tp->kreset); in tty3270_free_view()
750 raw3270_request_free(tp->read); in tty3270_free_view()
751 raw3270_request_free(tp->write); in tty3270_free_view()
753 free_pages((unsigned long) tp->freemem_pages[pages], 0); in tty3270_free_view()
754 kfree(tp->freemem_pages); in tty3270_free_view()
755 tty_port_destroy(&tp->port); in tty3270_free_view()
756 kfree(tp); in tty3270_free_view()
806 struct tty3270 *tp = container_of(work, struct tty3270, resize_work); in tty3270_resize_work() local
812 screen = tty3270_alloc_screen(tp->n_rows, tp->n_cols); in tty3270_resize_work()
816 spin_lock_bh(&tp->view.lock); in tty3270_resize_work()
817 oscreen = tp->screen; in tty3270_resize_work()
818 orows = tp->view.rows; in tty3270_resize_work()
819 tp->view.model = tp->n_model; in tty3270_resize_work()
820 tp->view.rows = tp->n_rows; in tty3270_resize_work()
821 tp->view.cols = tp->n_cols; in tty3270_resize_work()
822 tp->screen = screen; in tty3270_resize_work()
823 free_string(&tp->freemem, tp->prompt); in tty3270_resize_work()
824 free_string(&tp->freemem, tp->status); in tty3270_resize_work()
825 tty3270_create_prompt(tp); in tty3270_resize_work()
826 tty3270_create_status(tp); in tty3270_resize_work()
827 tp->nr_up = 0; in tty3270_resize_work()
828 while (tp->nr_lines < tp->view.rows - 2) in tty3270_resize_work()
829 tty3270_blank_line(tp); in tty3270_resize_work()
830 tp->update_flags = TTY_UPDATE_ALL; in tty3270_resize_work()
831 spin_unlock_bh(&tp->view.lock); in tty3270_resize_work()
833 tty3270_set_timer(tp, 1); in tty3270_resize_work()
835 tty = tty_port_tty_get(&tp->port); in tty3270_resize_work()
838 ws.ws_row = tp->view.rows - 2; in tty3270_resize_work()
839 ws.ws_col = tp->view.cols; in tty3270_resize_work()
846 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_resize() local
848 tp->n_model = model; in tty3270_resize()
849 tp->n_rows = rows; in tty3270_resize()
850 tp->n_cols = cols; in tty3270_resize()
851 schedule_work(&tp->resize_work); in tty3270_resize()
860 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_release() local
861 struct tty_struct *tty = tty_port_tty_get(&tp->port); in tty3270_release()
865 tty_port_tty_set(&tp->port, NULL); in tty3270_release()
867 raw3270_put_view(&tp->view); in tty3270_release()
878 struct tty3270 *tp = container_of(view, struct tty3270, view); in tty3270_free() local
880 del_timer_sync(&tp->timer); in tty3270_free()
881 tty3270_free_screen(tp->screen, tp->view.rows); in tty3270_free()
882 tty3270_free_view(tp); in tty3270_free()
915 struct tty3270 *tp; in tty3270_install() local
921 tp = container_of(view, struct tty3270, view); in tty3270_install()
922 tty->driver_data = tp; in tty3270_install()
923 tty->winsize.ws_row = tp->view.rows - 2; in tty3270_install()
924 tty->winsize.ws_col = tp->view.cols; in tty3270_install()
925 tp->port.low_latency = 0; in tty3270_install()
927 tty_port_tty_set(&tp->port, tty); in tty3270_install()
928 tp->inattr = TF_INPUT; in tty3270_install()
929 return tty_port_install(&tp->port, driver, tty); in tty3270_install()
935 tp = tty3270_alloc_view(); in tty3270_install()
936 if (IS_ERR(tp)) in tty3270_install()
937 return PTR_ERR(tp); in tty3270_install()
939 rc = raw3270_add_view(&tp->view, &tty3270_fn, in tty3270_install()
942 tty3270_free_view(tp); in tty3270_install()
946 tp->screen = tty3270_alloc_screen(tp->view.rows, tp->view.cols); in tty3270_install()
947 if (IS_ERR(tp->screen)) { in tty3270_install()
948 rc = PTR_ERR(tp->screen); in tty3270_install()
949 raw3270_put_view(&tp->view); in tty3270_install()
950 raw3270_del_view(&tp->view); in tty3270_install()
951 tty3270_free_view(tp); in tty3270_install()
955 tty_port_tty_set(&tp->port, tty); in tty3270_install()
956 tp->port.low_latency = 0; in tty3270_install()
957 tty->winsize.ws_row = tp->view.rows - 2; in tty3270_install()
958 tty->winsize.ws_col = tp->view.cols; in tty3270_install()
960 tty3270_create_prompt(tp); in tty3270_install()
961 tty3270_create_status(tp); in tty3270_install()
962 tty3270_update_status(tp); in tty3270_install()
965 for (i = 0; i < tp->view.rows - 2; i++) in tty3270_install()
966 tty3270_blank_line(tp); in tty3270_install()
968 tp->kbd->port = &tp->port; in tty3270_install()
969 tp->kbd->fn_handler[KVAL(K_INCRCONSOLE)] = tty3270_exit_tty; in tty3270_install()
970 tp->kbd->fn_handler[KVAL(K_SCROLLBACK)] = tty3270_scroll_backward; in tty3270_install()
971 tp->kbd->fn_handler[KVAL(K_SCROLLFORW)] = tty3270_scroll_forward; in tty3270_install()
972 tp->kbd->fn_handler[KVAL(K_CONS)] = tty3270_rcl_backward; in tty3270_install()
973 kbd_ascebc(tp->kbd, tp->view.ascebc); in tty3270_install()
975 raw3270_activate_view(&tp->view); in tty3270_install()
977 rc = tty_port_install(&tp->port, driver, tty); in tty3270_install()
979 raw3270_put_view(&tp->view); in tty3270_install()
983 tty->driver_data = tp; in tty3270_install()
994 struct tty3270 *tp = tty->driver_data; in tty3270_open() local
995 struct tty_port *port = &tp->port; in tty3270_open()
1009 struct tty3270 *tp = tty->driver_data; in tty3270_close() local
1013 if (tp) { in tty3270_close()
1015 tty_port_tty_set(&tp->port, NULL); in tty3270_close()
1021 struct tty3270 *tp = tty->driver_data; in tty3270_cleanup() local
1023 if (tp) in tty3270_cleanup()
1024 raw3270_put_view(&tp->view); in tty3270_cleanup()
1040 static void tty3270_put_character(struct tty3270 *tp, char ch) in tty3270_put_character() argument
1045 line = tp->screen + tp->cy; in tty3270_put_character()
1046 if (line->len <= tp->cx) { in tty3270_put_character()
1047 while (line->len < tp->cx) { in tty3270_put_character()
1049 cell->character = tp->view.ascebc[' ']; in tty3270_put_character()
1050 cell->highlight = tp->highlight; in tty3270_put_character()
1051 cell->f_color = tp->f_color; in tty3270_put_character()
1056 cell = line->cells + tp->cx; in tty3270_put_character()
1057 cell->character = tp->view.ascebc[(unsigned int) ch]; in tty3270_put_character()
1058 cell->highlight = tp->highlight; in tty3270_put_character()
1059 cell->f_color = tp->f_color; in tty3270_put_character()
1066 tty3270_convert_line(struct tty3270 *tp, int line_nr) in tty3270_convert_line() argument
1078 line = tp->screen + line_nr; in tty3270_convert_line()
1096 if (line->len < tp->view.cols) in tty3270_convert_line()
1100 i = tp->view.rows - 2 - line_nr; in tty3270_convert_line()
1101 list_for_each_entry_reverse(s, &tp->lines, list) in tty3270_convert_line()
1109 n = tty3270_alloc_string(tp, flen); in tty3270_convert_line()
1114 free_string(&tp->freemem, s); in tty3270_convert_line()
1151 if (line->len < tp->view.cols) { in tty3270_convert_line()
1158 if (tp->nr_up + line_nr < tp->view.rows - 2) { in tty3270_convert_line()
1160 tty3270_update_string(tp, s, line_nr); in tty3270_convert_line()
1163 list_add_tail(&s->update, &tp->update); in tty3270_convert_line()
1164 tp->update_flags |= TTY_UPDATE_LIST; in tty3270_convert_line()
1173 tty3270_cr(struct tty3270 *tp) in tty3270_cr() argument
1175 tp->cx = 0; in tty3270_cr()
1182 tty3270_lf(struct tty3270 *tp) in tty3270_lf() argument
1187 tty3270_convert_line(tp, tp->cy); in tty3270_lf()
1188 if (tp->cy < tp->view.rows - 3) { in tty3270_lf()
1189 tp->cy++; in tty3270_lf()
1193 tty3270_blank_line(tp); in tty3270_lf()
1194 temp = tp->screen[0]; in tty3270_lf()
1196 for (i = 0; i < tp->view.rows - 3; i++) in tty3270_lf()
1197 tp->screen[i] = tp->screen[i+1]; in tty3270_lf()
1198 tp->screen[tp->view.rows - 3] = temp; in tty3270_lf()
1199 tty3270_rebuild_update(tp); in tty3270_lf()
1203 tty3270_ri(struct tty3270 *tp) in tty3270_ri() argument
1205 if (tp->cy > 0) { in tty3270_ri()
1206 tty3270_convert_line(tp, tp->cy); in tty3270_ri()
1207 tp->cy--; in tty3270_ri()
1215 tty3270_insert_characters(struct tty3270 *tp, int n) in tty3270_insert_characters() argument
1220 line = tp->screen + tp->cy; in tty3270_insert_characters()
1221 while (line->len < tp->cx) { in tty3270_insert_characters()
1222 line->cells[line->len].character = tp->view.ascebc[' ']; in tty3270_insert_characters()
1227 if (n > tp->view.cols - tp->cx) in tty3270_insert_characters()
1228 n = tp->view.cols - tp->cx; in tty3270_insert_characters()
1229 k = min_t(int, line->len - tp->cx, tp->view.cols - tp->cx - n); in tty3270_insert_characters()
1231 line->cells[tp->cx + n + k] = line->cells[tp->cx + k]; in tty3270_insert_characters()
1233 if (line->len > tp->view.cols) in tty3270_insert_characters()
1234 line->len = tp->view.cols; in tty3270_insert_characters()
1236 line->cells[tp->cx + n].character = tp->view.ascebc[' ']; in tty3270_insert_characters()
1237 line->cells[tp->cx + n].highlight = tp->highlight; in tty3270_insert_characters()
1238 line->cells[tp->cx + n].f_color = tp->f_color; in tty3270_insert_characters()
1246 tty3270_delete_characters(struct tty3270 *tp, int n) in tty3270_delete_characters() argument
1251 line = tp->screen + tp->cy; in tty3270_delete_characters()
1252 if (line->len <= tp->cx) in tty3270_delete_characters()
1254 if (line->len - tp->cx <= n) { in tty3270_delete_characters()
1255 line->len = tp->cx; in tty3270_delete_characters()
1258 for (i = tp->cx; i + n < line->len; i++) in tty3270_delete_characters()
1267 tty3270_erase_characters(struct tty3270 *tp, int n) in tty3270_erase_characters() argument
1272 line = tp->screen + tp->cy; in tty3270_erase_characters()
1273 while (line->len > tp->cx && n-- > 0) { in tty3270_erase_characters()
1274 cell = line->cells + tp->cx++; in tty3270_erase_characters()
1279 tp->cx += n; in tty3270_erase_characters()
1280 tp->cx = min_t(int, tp->cx, tp->view.cols - 1); in tty3270_erase_characters()
1290 tty3270_erase_line(struct tty3270 *tp, int mode) in tty3270_erase_line() argument
1296 line = tp->screen + tp->cy; in tty3270_erase_line()
1298 line->len = tp->cx; in tty3270_erase_line()
1300 for (i = 0; i < tp->cx; i++) { in tty3270_erase_line()
1306 if (line->len <= tp->cx) in tty3270_erase_line()
1307 line->len = tp->cx + 1; in tty3270_erase_line()
1310 tty3270_convert_line(tp, tp->cy); in tty3270_erase_line()
1320 tty3270_erase_display(struct tty3270 *tp, int mode) in tty3270_erase_display() argument
1325 tty3270_erase_line(tp, 0); in tty3270_erase_display()
1326 for (i = tp->cy + 1; i < tp->view.rows - 2; i++) { in tty3270_erase_display()
1327 tp->screen[i].len = 0; in tty3270_erase_display()
1328 tty3270_convert_line(tp, i); in tty3270_erase_display()
1331 for (i = 0; i < tp->cy; i++) { in tty3270_erase_display()
1332 tp->screen[i].len = 0; in tty3270_erase_display()
1333 tty3270_convert_line(tp, i); in tty3270_erase_display()
1335 tty3270_erase_line(tp, 1); in tty3270_erase_display()
1337 for (i = 0; i < tp->view.rows - 2; i++) { in tty3270_erase_display()
1338 tp->screen[i].len = 0; in tty3270_erase_display()
1339 tty3270_convert_line(tp, i); in tty3270_erase_display()
1342 tty3270_rebuild_update(tp); in tty3270_erase_display()
1350 tty3270_set_attributes(struct tty3270 *tp) in tty3270_set_attributes() argument
1358 for (i = 0; i <= tp->esc_npar; i++) { in tty3270_set_attributes()
1359 attr = tp->esc_par[i]; in tty3270_set_attributes()
1362 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1363 tp->f_color = TAC_RESET; in tty3270_set_attributes()
1367 tp->highlight = TAX_UNDER; in tty3270_set_attributes()
1370 tp->highlight = TAX_BLINK; in tty3270_set_attributes()
1373 tp->highlight = TAX_REVER; in tty3270_set_attributes()
1376 if (tp->highlight == TAX_UNDER) in tty3270_set_attributes()
1377 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1380 if (tp->highlight == TAX_BLINK) in tty3270_set_attributes()
1381 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1384 if (tp->highlight == TAX_REVER) in tty3270_set_attributes()
1385 tp->highlight = TAX_RESET; in tty3270_set_attributes()
1397 tp->f_color = f_colors[attr - 30]; in tty3270_set_attributes()
1404 tty3270_getpar(struct tty3270 *tp, int ix) in tty3270_getpar() argument
1406 return (tp->esc_par[ix] > 0) ? tp->esc_par[ix] : 1; in tty3270_getpar()
1410 tty3270_goto_xy(struct tty3270 *tp, int cx, int cy) in tty3270_goto_xy() argument
1415 tp->cx = min_t(int, tp->view.cols - 1, max_cx); in tty3270_goto_xy()
1416 cy = min_t(int, tp->view.rows - 3, max_cy); in tty3270_goto_xy()
1417 if (cy != tp->cy) { in tty3270_goto_xy()
1418 tty3270_convert_line(tp, tp->cy); in tty3270_goto_xy()
1419 tp->cy = cy; in tty3270_goto_xy()
1444 tty3270_escape_sequence(struct tty3270 *tp, char ch) in tty3270_escape_sequence() argument
1448 if (tp->esc_state == ESnormal) { in tty3270_escape_sequence()
1451 tp->esc_state = ESesc; in tty3270_escape_sequence()
1454 if (tp->esc_state == ESesc) { in tty3270_escape_sequence()
1455 tp->esc_state = ESnormal; in tty3270_escape_sequence()
1458 tp->esc_state = ESsquare; in tty3270_escape_sequence()
1461 tty3270_cr(tp); in tty3270_escape_sequence()
1462 tty3270_lf(tp); in tty3270_escape_sequence()
1465 tty3270_ri(tp); in tty3270_escape_sequence()
1468 tty3270_lf(tp); in tty3270_escape_sequence()
1471 kbd_puts_queue(&tp->port, "\033[?6c"); in tty3270_escape_sequence()
1474 tp->saved_cx = tp->cx; in tty3270_escape_sequence()
1475 tp->saved_cy = tp->cy; in tty3270_escape_sequence()
1476 tp->saved_highlight = tp->highlight; in tty3270_escape_sequence()
1477 tp->saved_f_color = tp->f_color; in tty3270_escape_sequence()
1480 tty3270_convert_line(tp, tp->cy); in tty3270_escape_sequence()
1481 tty3270_goto_xy(tp, tp->saved_cx, tp->saved_cy); in tty3270_escape_sequence()
1482 tp->highlight = tp->saved_highlight; in tty3270_escape_sequence()
1483 tp->f_color = tp->saved_f_color; in tty3270_escape_sequence()
1486 tp->cx = tp->saved_cx = 0; in tty3270_escape_sequence()
1487 tp->cy = tp->saved_cy = 0; in tty3270_escape_sequence()
1488 tp->highlight = tp->saved_highlight = TAX_RESET; in tty3270_escape_sequence()
1489 tp->f_color = tp->saved_f_color = TAC_RESET; in tty3270_escape_sequence()
1490 tty3270_erase_display(tp, 2); in tty3270_escape_sequence()
1495 if (tp->esc_state == ESsquare) { in tty3270_escape_sequence()
1496 tp->esc_state = ESgetpars; in tty3270_escape_sequence()
1497 memset(tp->esc_par, 0, sizeof(tp->esc_par)); in tty3270_escape_sequence()
1498 tp->esc_npar = 0; in tty3270_escape_sequence()
1499 tp->esc_ques = (ch == '?'); in tty3270_escape_sequence()
1500 if (tp->esc_ques) in tty3270_escape_sequence()
1503 if (tp->esc_state == ESgetpars) { in tty3270_escape_sequence()
1504 if (ch == ';' && tp->esc_npar < ESCAPE_NPAR - 1) { in tty3270_escape_sequence()
1505 tp->esc_npar++; in tty3270_escape_sequence()
1509 tp->esc_par[tp->esc_npar] *= 10; in tty3270_escape_sequence()
1510 tp->esc_par[tp->esc_npar] += ch - '0'; in tty3270_escape_sequence()
1514 tp->esc_state = ESnormal; in tty3270_escape_sequence()
1515 if (ch == 'n' && !tp->esc_ques) { in tty3270_escape_sequence()
1516 if (tp->esc_par[0] == 5) /* Status report. */ in tty3270_escape_sequence()
1517 kbd_puts_queue(&tp->port, "\033[0n"); in tty3270_escape_sequence()
1518 else if (tp->esc_par[0] == 6) { /* Cursor report. */ in tty3270_escape_sequence()
1520 sprintf(buf, "\033[%d;%dR", tp->cy + 1, tp->cx + 1); in tty3270_escape_sequence()
1521 kbd_puts_queue(&tp->port, buf); in tty3270_escape_sequence()
1525 if (tp->esc_ques) in tty3270_escape_sequence()
1529 tty3270_set_attributes(tp); in tty3270_escape_sequence()
1533 tty3270_goto_xy(tp, tty3270_getpar(tp, 1) - 1, in tty3270_escape_sequence()
1534 tty3270_getpar(tp, 0) - 1); in tty3270_escape_sequence()
1537 tty3270_goto_xy(tp, tp->cx, tty3270_getpar(tp, 0) - 1); in tty3270_escape_sequence()
1541 tty3270_goto_xy(tp, tp->cx, tp->cy - tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1546 tty3270_goto_xy(tp, tp->cx, tp->cy + tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1550 tty3270_goto_xy(tp, tp->cx + tty3270_getpar(tp, 0), tp->cy); in tty3270_escape_sequence()
1553 tty3270_goto_xy(tp, tp->cx - tty3270_getpar(tp, 0), tp->cy); in tty3270_escape_sequence()
1557 tty3270_goto_xy(tp, tty3270_getpar(tp, 0), tp->cy); in tty3270_escape_sequence()
1560 tty3270_erase_characters(tp, tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1563 tty3270_erase_display(tp, tp->esc_par[0]); in tty3270_escape_sequence()
1566 tty3270_erase_line(tp, tp->esc_par[0]); in tty3270_escape_sequence()
1569 tty3270_delete_characters(tp, tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1572 tty3270_insert_characters(tp, tty3270_getpar(tp, 0)); in tty3270_escape_sequence()
1575 tp->saved_cx = tp->cx; in tty3270_escape_sequence()
1576 tp->saved_cy = tp->cy; in tty3270_escape_sequence()
1577 tp->saved_highlight = tp->highlight; in tty3270_escape_sequence()
1578 tp->saved_f_color = tp->f_color; in tty3270_escape_sequence()
1581 tty3270_convert_line(tp, tp->cy); in tty3270_escape_sequence()
1582 tty3270_goto_xy(tp, tp->saved_cx, tp->saved_cy); in tty3270_escape_sequence()
1583 tp->highlight = tp->saved_highlight; in tty3270_escape_sequence()
1584 tp->f_color = tp->saved_f_color; in tty3270_escape_sequence()
1593 tty3270_do_write(struct tty3270 *tp, struct tty_struct *tty, in tty3270_do_write() argument
1598 spin_lock_bh(&tp->view.lock); in tty3270_do_write()
1600 if (tp->esc_state != 0) { in tty3270_do_write()
1602 tty3270_escape_sequence(tp, buf[i_msg]); in tty3270_do_write()
1608 tp->wcc |= TW_PLUSALARM; in tty3270_do_write()
1611 if (tp->cx > 0) { in tty3270_do_write()
1612 tp->cx--; in tty3270_do_write()
1613 tty3270_put_character(tp, ' '); in tty3270_do_write()
1617 for (i = tp->cx % 8; i < 8; i++) { in tty3270_do_write()
1618 if (tp->cx >= tp->view.cols) { in tty3270_do_write()
1619 tty3270_cr(tp); in tty3270_do_write()
1620 tty3270_lf(tp); in tty3270_do_write()
1623 tty3270_put_character(tp, ' '); in tty3270_do_write()
1624 tp->cx++; in tty3270_do_write()
1628 tty3270_cr(tp); in tty3270_do_write()
1629 tty3270_lf(tp); in tty3270_do_write()
1632 tty3270_erase_display(tp, 2); in tty3270_do_write()
1633 tp->cx = tp->cy = 0; in tty3270_do_write()
1636 tp->cx = 0; in tty3270_do_write()
1641 tty3270_escape_sequence(tp, buf[i_msg]); in tty3270_do_write()
1644 if (tp->cx >= tp->view.cols) { in tty3270_do_write()
1645 tty3270_cr(tp); in tty3270_do_write()
1646 tty3270_lf(tp); in tty3270_do_write()
1648 tty3270_put_character(tp, buf[i_msg]); in tty3270_do_write()
1649 tp->cx++; in tty3270_do_write()
1654 tty3270_convert_line(tp, tp->cy); in tty3270_do_write()
1657 if (!timer_pending(&tp->timer)) in tty3270_do_write()
1658 tty3270_set_timer(tp, HZ/10); in tty3270_do_write()
1660 spin_unlock_bh(&tp->view.lock); in tty3270_do_write()
1670 struct tty3270 *tp; in tty3270_write() local
1672 tp = tty->driver_data; in tty3270_write()
1673 if (!tp) in tty3270_write()
1675 if (tp->char_count > 0) { in tty3270_write()
1676 tty3270_do_write(tp, tty, tp->char_buf, tp->char_count); in tty3270_write()
1677 tp->char_count = 0; in tty3270_write()
1679 tty3270_do_write(tp, tty, buf, count); in tty3270_write()
1688 struct tty3270 *tp; in tty3270_put_char() local
1690 tp = tty->driver_data; in tty3270_put_char()
1691 if (!tp || tp->char_count >= TTY3270_CHAR_BUF_SIZE) in tty3270_put_char()
1693 tp->char_buf[tp->char_count++] = ch; in tty3270_put_char()
1704 struct tty3270 *tp; in tty3270_flush_chars() local
1706 tp = tty->driver_data; in tty3270_flush_chars()
1707 if (!tp) in tty3270_flush_chars()
1709 if (tp->char_count > 0) { in tty3270_flush_chars()
1710 tty3270_do_write(tp, tty, tp->char_buf, tp->char_count); in tty3270_flush_chars()
1711 tp->char_count = 0; in tty3270_flush_chars()
1737 struct tty3270 *tp; in tty3270_set_termios() local
1740 tp = tty->driver_data; in tty3270_set_termios()
1741 if (!tp) in tty3270_set_termios()
1743 spin_lock_bh(&tp->view.lock); in tty3270_set_termios()
1746 if (new != tp->inattr) { in tty3270_set_termios()
1747 tp->inattr = new; in tty3270_set_termios()
1748 tty3270_update_prompt(tp, NULL, 0); in tty3270_set_termios()
1749 tty3270_set_timer(tp, 1); in tty3270_set_termios()
1752 spin_unlock_bh(&tp->view.lock); in tty3270_set_termios()
1761 struct tty3270 *tp; in tty3270_throttle() local
1763 tp = tty->driver_data; in tty3270_throttle()
1764 if (!tp) in tty3270_throttle()
1766 tp->throttle = 1; in tty3270_throttle()
1775 struct tty3270 *tp; in tty3270_unthrottle() local
1777 tp = tty->driver_data; in tty3270_unthrottle()
1778 if (!tp) in tty3270_unthrottle()
1780 tp->throttle = 0; in tty3270_unthrottle()
1781 if (tp->attn) in tty3270_unthrottle()
1782 tty3270_issue_read(tp, 1); in tty3270_unthrottle()
1802 struct tty3270 *tp; in tty3270_ioctl() local
1804 tp = tty->driver_data; in tty3270_ioctl()
1805 if (!tp) in tty3270_ioctl()
1809 return kbd_ioctl(tp->kbd, cmd, arg); in tty3270_ioctl()
1816 struct tty3270 *tp; in tty3270_compat_ioctl() local
1818 tp = tty->driver_data; in tty3270_compat_ioctl()
1819 if (!tp) in tty3270_compat_ioctl()
1823 return kbd_ioctl(tp->kbd, cmd, (unsigned long)compat_ptr(arg)); in tty3270_compat_ioctl()