// SPDX-License-Identifier: GPL-2.0
/*
 *    IBM/3270 Driver - tty functions.
 *
 *  Author(s):
 *    Original 3270 Code for 2.4 written by Richard Hitt (UTS Global)
 *    Rewritten for 2.5 by Martin Schwidefsky <schwidefsky@de.ibm.com>
 *	-- Copyright IBM Corp. 2003
 */

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kdev_t.h>
#include <linux/tty.h>
#include <linux/vt_kern.h>
#include <linux/init.h>
#include <linux/console.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/panic_notifier.h>
#include <linux/reboot.h>
#include <linux/slab.h>
#include <linux/memblock.h>
#include <linux/compat.h>

#include <asm/ccwdev.h>
#include <asm/cio.h>
#include <asm/ebcdic.h>
#include <asm/cpcmd.h>
#include <linux/uaccess.h>

#include "raw3270.h"
#include "keyboard.h"

#define TTY3270_CHAR_BUF_SIZE 256
#define TTY3270_OUTPUT_BUFFER_SIZE 4096
#define TTY3270_SCREEN_PAGES 8 /* has to be power-of-two */
#define TTY3270_RECALL_SIZE 16 /* has to be power-of-two */
#define TTY3270_STATUS_AREA_SIZE 40

static struct tty_driver *tty3270_driver;
static int tty3270_max_index;
static struct raw3270_fn tty3270_fn;

#define TTY3270_HIGHLIGHT_BLINK		1
#define TTY3270_HIGHLIGHT_REVERSE	2
#define TTY3270_HIGHLIGHT_UNDERSCORE	4

struct tty3270_attribute {
	unsigned char alternate_charset:1;	/* Graphics charset */
	unsigned char highlight:3;		/* Blink/reverse/underscore */
	unsigned char f_color:4;		/* Foreground color */
	unsigned char b_color:4;		/* Background color */
};

struct tty3270_cell {
	unsigned char character;
	struct tty3270_attribute attributes;
};

struct tty3270_line {
	struct tty3270_cell *cells;
	int len;
	int dirty;
};

static const unsigned char sfq_read_partition[] = {
	0x00, 0x07, 0x01, 0xff, 0x03, 0x00, 0x81
};

#define ESCAPE_NPAR 8

/*
 * The main tty view data structure.
 * FIXME:
 * 1) describe line orientation & lines list concept against screen
 * 2) describe conversion of screen to lines
 * 3) describe line format.
 */
struct tty3270 {
	struct raw3270_view view;
	struct tty_port port;

	/* Output stuff. */
	unsigned char wcc;		/* Write control character. */
	int nr_up;			/* # lines up in history. */
	unsigned long update_flags;	/* Update indication bits. */
	struct raw3270_request *write;	/* Single write request. */
	struct timer_list timer;	/* Output delay timer. */
	char *converted_line;		/* RAW 3270 data stream */
	unsigned int line_view_start;	/* Start of visible area */
	unsigned int line_write_start;	/* current write position */
	unsigned int oops_line;		/* line counter used when print oops */

	/* Current tty screen. */
	unsigned int cx, cy;		/* Current output position. */
	struct tty3270_attribute attributes;
	struct tty3270_attribute saved_attributes;
	int allocated_lines;
	struct tty3270_line *screen;

	/* Input stuff. */
	char *prompt;			/* Output string for input area. */
	char *input;			/* Input string for read request. */
	struct raw3270_request *read;	/* Single read request. */
	struct raw3270_request *kreset;	/* Single keyboard reset request. */
	struct raw3270_request *readpartreq;
	unsigned char inattr;		/* Visible/invisible input. */
	int throttle, attn;		/* tty throttle/unthrottle. */
	struct tasklet_struct readlet;	/* Tasklet to issue read request. */
	struct tasklet_struct hanglet;	/* Tasklet to hang up the tty. */
	struct kbd_data *kbd;		/* key_maps stuff. */

	/* Escape sequence parsing. */
	int esc_state, esc_ques, esc_npar;
	int esc_par[ESCAPE_NPAR];
	unsigned int saved_cx, saved_cy;

	/* Command recalling. */
	char **rcl_lines;		/* Array of recallable lines */
	int rcl_write_index;		/* Write index of recallable items */
	int rcl_read_index;		/* Read index of recallable items */

	/* Character array for put_char/flush_chars. */
	unsigned int char_count;
	char char_buf[TTY3270_CHAR_BUF_SIZE];
};

/* tty3270->update_flags. See tty3270_update for details. */
#define TTY_UPDATE_INPUT	0x1	/* Update input line. */
#define TTY_UPDATE_STATUS	0x2	/* Update status line. */
#define TTY_UPDATE_LINES	0x4	/* Update visible screen lines */
#define TTY_UPDATE_ALL		0x7	/* Recreate screen. */

#define TTY3270_INPUT_AREA_ROWS 2

/*
 * Setup timeout for a device. On timeout trigger an update.
 */
static void tty3270_set_timer(struct tty3270 *tp, int expires)
{
	mod_timer(&tp->timer, jiffies + expires);
}

static int tty3270_tty_rows(struct tty3270 *tp)
{
	return tp->view.rows - TTY3270_INPUT_AREA_ROWS;
}

static char *tty3270_add_ba(struct tty3270 *tp, char *cp, char order, int x, int y)
{
	*cp++ = order;
	raw3270_buffer_address(tp->view.dev, cp, x, y);
	return cp + 2;
}

static char *tty3270_add_ra(struct tty3270 *tp, char *cp, int x, int y, char c)
{
	cp = tty3270_add_ba(tp, cp, TO_RA, x, y);
	*cp++ = c;
	return cp;
}

static char *tty3270_add_sa(struct tty3270 *tp, char *cp, char attr, char value)
{
	*cp++ = TO_SA;
	*cp++ = attr;
	*cp++ = value;
	return cp;
}

static char *tty3270_add_ge(struct tty3270 *tp, char *cp, char c)
{
	*cp++ = TO_GE;
	*cp++ = c;
	return cp;
}

static char *tty3270_add_sf(struct tty3270 *tp, char *cp, char type)
{
	*cp++ = TO_SF;
	*cp++ = type;
	return cp;
}

static int tty3270_line_increment(struct tty3270 *tp, unsigned int line, unsigned int incr)
{
	return (line + incr) & (tp->allocated_lines - 1);
}

static struct tty3270_line *tty3270_get_write_line(struct tty3270 *tp, unsigned int num)
{
	return tp->screen + tty3270_line_increment(tp, tp->line_write_start, num);
}

static struct tty3270_line *tty3270_get_view_line(struct tty3270 *tp, unsigned int num)
{
	return tp->screen + tty3270_line_increment(tp, tp->line_view_start, num - tp->nr_up);
}

static int tty3270_input_size(int cols)
{
	return cols * 2 - 11;
}

static void tty3270_update_prompt(struct tty3270 *tp, char *input)
{
	strcpy(tp->prompt, input);
	tp->update_flags |= TTY_UPDATE_INPUT;
	tty3270_set_timer(tp, 1);
}

/*
 * The input line are the two last lines of the screen.
 */
static int tty3270_add_prompt(struct tty3270 *tp)
{
	int count = 0;
	char *cp;

	cp = tp->converted_line;
	cp = tty3270_add_ba(tp, cp, TO_SBA, 0, -2);
	*cp++ = tp->view.ascebc['>'];

	if (*tp->prompt) {
		cp = tty3270_add_sf(tp, cp, TF_INMDT);
		count = min_t(int, strlen(tp->prompt),
			      tp->view.cols * 2 - TTY3270_STATUS_AREA_SIZE - 2);
		memcpy(cp, tp->prompt, count);
		cp += count;
	} else {
		cp = tty3270_add_sf(tp, cp, tp->inattr);
	}
	*cp++ = TO_IC;
	/* Clear to end of input line. */
	if (count < tp->view.cols * 2 - 11)
		cp = tty3270_add_ra(tp, cp, -TTY3270_STATUS_AREA_SIZE, -1, 0);
	return cp - tp->converted_line;
}

static char *tty3270_ebcdic_convert(struct tty3270 *tp, char *d, char *s)
{
	while (*s)
		*d++ = tp->view.ascebc[(int)*s++];
	return d;
}

/*
 * The status line is the last line of the screen. It shows the string
 * "Running"/"History X" in the lower right corner of the screen.
 */
static int tty3270_add_status(struct tty3270 *tp)
{
	char *cp = tp->converted_line;
	int len;

	cp = tty3270_add_ba(tp, cp, TO_SBA, -TTY3270_STATUS_AREA_SIZE, -1);
	cp = tty3270_add_sf(tp, cp, TF_LOG);
	cp = tty3270_add_sa(tp, cp, TAT_FGCOLOR, TAC_GREEN);
	cp = tty3270_ebcdic_convert(tp, cp, " 7");
	cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_REVER);
	cp = tty3270_ebcdic_convert(tp, cp, "PrevPg");
	cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_RESET);
	cp = tty3270_ebcdic_convert(tp, cp, " 8");
	cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_REVER);
	cp = tty3270_ebcdic_convert(tp, cp, "NextPg");
	cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_RESET);
	cp = tty3270_ebcdic_convert(tp, cp, " 12");
	cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_REVER);
	cp = tty3270_ebcdic_convert(tp, cp, "Recall");
	cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_RESET);
	cp = tty3270_ebcdic_convert(tp, cp, "  ");
	if (tp->nr_up) {
		len = sprintf(cp, "History %d", -tp->nr_up);
		codepage_convert(tp->view.ascebc, cp, len);
		cp += len;
	} else {
		cp = tty3270_ebcdic_convert(tp, cp, oops_in_progress ? "Crashed" : "Running");
	}
	cp = tty3270_add_sf(tp, cp, TF_LOG);
	cp = tty3270_add_sa(tp, cp, TAT_FGCOLOR, TAC_RESET);
	return cp - (char *)tp->converted_line;
}

static void tty3270_blank_screen(struct tty3270 *tp)
{
	struct tty3270_line *line;
	int i;

	for (i = 0; i < tty3270_tty_rows(tp); i++) {
		line = tty3270_get_write_line(tp, i);
		line->len = 0;
		line->dirty = 1;
	}
	tp->nr_up = 0;
}

/*
 * Write request completion callback.
 */
static void tty3270_write_callback(struct raw3270_request *rq, void *data)
{
	struct tty3270 *tp = container_of(rq->view, struct tty3270, view);

	if (rq->rc != 0) {
		/* Write wasn't successful. Refresh all. */
		tp->update_flags = TTY_UPDATE_ALL;
		tty3270_set_timer(tp, 1);
	}
	raw3270_request_reset(rq);
	xchg(&tp->write, rq);
}

static int tty3270_required_length(struct tty3270 *tp, struct tty3270_line *line)
{
	unsigned char f_color, b_color, highlight;
	struct tty3270_cell *cell;
	int i, flen = 3;		/* Prefix (TO_SBA). */

	flen += line->len;
	highlight = 0;
	f_color = TAC_RESET;
	b_color = TAC_RESET;

	for (i = 0, cell = line->cells; i < line->len; i++, cell++) {
		if (cell->attributes.highlight != highlight) {
			flen += 3;	/* TO_SA to switch highlight. */
			highlight = cell->attributes.highlight;
		}
		if (cell->attributes.f_color != f_color) {
			flen += 3;	/* TO_SA to switch color. */
			f_color = cell->attributes.f_color;
		}
		if (cell->attributes.b_color != b_color) {
			flen += 3;	/* TO_SA to switch color. */
			b_color = cell->attributes.b_color;
		}
		if (cell->attributes.alternate_charset)
			flen += 1;	/* TO_GE to switch to graphics extensions */
	}
	if (highlight)
		flen += 3;	/* TO_SA to reset hightlight. */
	if (f_color != TAC_RESET)
		flen += 3;	/* TO_SA to reset color. */
	if (b_color != TAC_RESET)
		flen += 3;	/* TO_SA to reset color. */
	if (line->len < tp->view.cols)
		flen += 4;	/* Postfix (TO_RA). */

	return flen;
}

static char *tty3270_add_reset_attributes(struct tty3270 *tp, struct tty3270_line *line,
					  char *cp, struct tty3270_attribute *attr, int lineno)
{
	if (attr->highlight)
		cp = tty3270_add_sa(tp, cp, TAT_EXTHI, TAX_RESET);
	if (attr->f_color != TAC_RESET)
		cp = tty3270_add_sa(tp, cp, TAT_FGCOLOR, TAX_RESET);
	if (attr->b_color != TAC_RESET)
		cp = tty3270_add_sa(tp, cp, TAT_BGCOLOR, TAX_RESET);
	if (line->len < tp->view.cols)
		cp = tty3270_add_ra(tp, cp, 0, lineno + 1, 0);
	return cp;
}

static char tty3270_graphics_translate(struct tty3270 *tp, char ch)
{
	switch (ch) {
	case 'q': /* - */
		return 0xa2;
	case 'x': /* '|' */
		return 0x85;
	case 'l': /* |- */
		return 0xc5;
	case 't': /* |_ */
		return 0xc6;
	case 'u': /* _| */
		return 0xd6;
	case 'k': /* -| */
		return 0xd5;
	case 'j':
		return 0xd4;
	case 'm':
		return 0xc4;
	case 'n': /* + */
		return 0xd3;
	case 'v':
		return 0xc7;
	case 'w':
		return 0xd7;
	default:
		return ch;
	}
}

static char *tty3270_add_attributes(struct tty3270 *tp, struct tty3270_line *line,
				    struct tty3270_attribute *attr, char *cp, int lineno)
{
	const unsigned char colors[16] = {
		[0] = TAC_DEFAULT,
		[1] = TAC_RED,
		[2] = TAC_GREEN,
		[3] = TAC_YELLOW,
		[4] = TAC_BLUE,
		[5] = TAC_PINK,
		[6] = TAC_TURQ,
		[7] = TAC_WHITE,
		[9] = TAC_DEFAULT
	};

	const unsigned char highlights[8] = {
		[TTY3270_HIGHLIGHT_BLINK] = TAX_BLINK,
		[TTY3270_HIGHLIGHT_REVERSE] = TAX_REVER,
		[TTY3270_HIGHLIGHT_UNDERSCORE] = TAX_UNDER,
	};

	struct tty3270_cell *cell;
	int c, i;

	cp = tty3270_add_ba(tp, cp, TO_SBA, 0, lineno);

	for (i = 0, cell = line->cells; i < line->len; i++, cell++) {
		if (cell->attributes.highlight != attr->highlight) {
			attr->highlight = cell->attributes.highlight;
			cp = tty3270_add_sa(tp, cp, TAT_EXTHI, highlights[attr->highlight]);
		}
		if (cell->attributes.f_color != attr->f_color) {
			attr->f_color = cell->attributes.f_color;
			cp = tty3270_add_sa(tp, cp, TAT_FGCOLOR, colors[attr->f_color]);
		}
		if (cell->attributes.b_color != attr->b_color) {
			attr->b_color = cell->attributes.b_color;
			cp = tty3270_add_sa(tp, cp, TAT_BGCOLOR, colors[attr->b_color]);
		}
		c = cell->character;
		if (cell->attributes.alternate_charset)
			cp = tty3270_add_ge(tp, cp, tty3270_graphics_translate(tp, c));
		else
			*cp++ = tp->view.ascebc[c];
	}
	return cp;
}

static void tty3270_reset_attributes(struct tty3270_attribute *attr)
{
	attr->highlight = TAX_RESET;
	attr->f_color = TAC_RESET;
	attr->b_color = TAC_RESET;
}

/*
 * Convert a tty3270_line to a 3270 data fragment usable for output.
 */
static unsigned int tty3270_convert_line(struct tty3270 *tp, struct tty3270_line *line, int lineno)
{
	struct tty3270_attribute attr;
	int flen;
	char *cp;

	/* Determine how long the fragment will be. */
	flen = tty3270_required_length(tp, line);
	if (flen > PAGE_SIZE)
		return 0;
	/* Write 3270 data fragment. */
	tty3270_reset_attributes(&attr);
	cp = tty3270_add_attributes(tp, line, &attr, tp->converted_line, lineno);
	cp = tty3270_add_reset_attributes(tp, line, cp, &attr, lineno);
	return cp - (char *)tp->converted_line;
}

static void tty3270_update_lines_visible(struct tty3270 *tp, struct raw3270_request *rq)
{
	struct tty3270_line *line;
	int len, i;

	for (i = 0; i < tty3270_tty_rows(tp); i++) {
		line = tty3270_get_view_line(tp, i);
		if (!line->dirty)
			continue;
		len = tty3270_convert_line(tp, line, i);
		if (raw3270_request_add_data(rq, tp->converted_line, len))
			break;
		line->dirty = 0;
	}
	if (i == tty3270_tty_rows(tp)) {
		for (i = 0; i < tp->allocated_lines; i++)
			tp->screen[i].dirty = 0;
		tp->update_flags &= ~TTY_UPDATE_LINES;
	}
}

static void tty3270_update_lines_all(struct tty3270 *tp, struct raw3270_request *rq)
{
	struct tty3270_line *line;
	char buf[4];
	int len, i;

	for (i = 0; i < tp->allocated_lines; i++) {
		line = tty3270_get_write_line(tp, i + tp->cy + 1);
		if (!line->dirty)
			continue;
		len = tty3270_convert_line(tp, line, tp->oops_line);
		if (raw3270_request_add_data(rq, tp->converted_line, len))
			break;
		line->dirty = 0;
		if (++tp->oops_line >= tty3270_tty_rows(tp))
			tp->oops_line = 0;
	}

	if (i == tp->allocated_lines) {
		if (tp->oops_line < tty3270_tty_rows(tp)) {
			tty3270_add_ra(tp, buf, 0, tty3270_tty_rows(tp), 0);
			if (raw3270_request_add_data(rq, buf, sizeof(buf)))
				return;
		}
		tp->update_flags &= ~TTY_UPDATE_LINES;
	}
}

/*
 * Update 3270 display.
 */
static void tty3270_update(struct timer_list *t)
{
	struct tty3270 *tp = from_timer(tp, t, timer);
	struct raw3270_request *wrq;
	u8 cmd = TC_WRITE;
	int rc, len;

	wrq = xchg(&tp->write, 0);
	if (!wrq) {
		tty3270_set_timer(tp, 1);
		return;
	}

	spin_lock_irq(&tp->view.lock);
	if (tp->update_flags == TTY_UPDATE_ALL)
		cmd = TC_EWRITEA;

	raw3270_request_set_cmd(wrq, cmd);
	raw3270_request_add_data(wrq, &tp->wcc, 1);
	tp->wcc = TW_NONE;

	/*
	 * Update status line.
	 */
	if (tp->update_flags & TTY_UPDATE_STATUS) {
		len = tty3270_add_status(tp);
		if (raw3270_request_add_data(wrq, tp->converted_line, len) == 0)
			tp->update_flags &= ~TTY_UPDATE_STATUS;
	}

	/*
	 * Write input line.
	 */
	if (tp->update_flags & TTY_UPDATE_INPUT) {
		len = tty3270_add_prompt(tp);
		if (raw3270_request_add_data(wrq, tp->converted_line, len) == 0)
			tp->update_flags &= ~TTY_UPDATE_INPUT;
	}

	if (tp->update_flags & TTY_UPDATE_LINES) {
		if (oops_in_progress)
			tty3270_update_lines_all(tp, wrq);
		else
			tty3270_update_lines_visible(tp, wrq);
	}

	wrq->callback = tty3270_write_callback;
	rc = raw3270_start(&tp->view, wrq);
	if (rc == 0) {
		if (tp->update_flags)
			tty3270_set_timer(tp, 1);
	} else {
		raw3270_request_reset(wrq);
		xchg(&tp->write, wrq);
	}
	spin_unlock_irq(&tp->view.lock);
}

/*
 * Command recalling.
 */
static void tty3270_rcl_add(struct tty3270 *tp, char *input, int len)
{
	char *p;

	if (len <= 0)
		return;
	p = tp->rcl_lines[tp->rcl_write_index++];
	tp->rcl_write_index &= TTY3270_RECALL_SIZE - 1;
	memcpy(p, input, len);
	p[len] = '\0';
	tp->rcl_read_index = tp->rcl_write_index;
}

static void tty3270_rcl_backward(struct kbd_data *kbd)
{
	struct tty3270 *tp = container_of(kbd->port, struct tty3270, port);
	int i = 0;

	spin_lock_irq(&tp->view.lock);
	if (tp->inattr == TF_INPUT) {
		do {
			tp->rcl_read_index--;
			tp->rcl_read_index &= TTY3270_RECALL_SIZE - 1;
		} while (!*tp->rcl_lines[tp->rcl_read_index] &&
			 i++ < TTY3270_RECALL_SIZE - 1);
		tty3270_update_prompt(tp, tp->rcl_lines[tp->rcl_read_index]);
	}
	spin_unlock_irq(&tp->view.lock);
}

/*
 * Deactivate tty view.
 */
static void tty3270_exit_tty(struct kbd_data *kbd)
{
	struct tty3270 *tp = container_of(kbd->port, struct tty3270, port);

	raw3270_deactivate_view(&tp->view);
}

static void tty3270_redraw(struct tty3270 *tp)
{
	int i;

	for (i = 0; i < tty3270_tty_rows(tp); i++)
		tty3270_get_view_line(tp, i)->dirty = 1;
	tp->update_flags = TTY_UPDATE_ALL;
	tty3270_set_timer(tp, 1);
}

/*
 * Scroll forward in history.
 */
static void tty3270_scroll_forward(struct kbd_data *kbd)
{
	struct tty3270 *tp = container_of(kbd->port, struct tty3270, port);

	spin_lock_irq(&tp->view.lock);

	if (tp->nr_up >= tty3270_tty_rows(tp))
		tp->nr_up -= tty3270_tty_rows(tp) / 2;
	else
		tp->nr_up = 0;
	tty3270_redraw(tp);
	spin_unlock_irq(&tp->view.lock);
}

/*
 * Scroll backward in history.
 */
static void tty3270_scroll_backward(struct kbd_data *kbd)
{
	struct tty3270 *tp = container_of(kbd->port, struct tty3270, port);

	spin_lock_irq(&tp->view.lock);
	tp->nr_up += tty3270_tty_rows(tp) / 2;
	if (tp->nr_up > tp->allocated_lines - tty3270_tty_rows(tp))
		tp->nr_up = tp->allocated_lines - tty3270_tty_rows(tp);
	tty3270_redraw(tp);
	spin_unlock_irq(&tp->view.lock);
}

/*
 * Pass input line to tty.
 */
static void tty3270_read_tasklet(unsigned long data)
{
	struct raw3270_request *rrq = (struct raw3270_request *)data;
	static char kreset_data = TW_KR;
	struct tty3270 *tp = container_of(rrq->view, struct tty3270, view);
	char *input;
	int len;

	spin_lock_irq(&tp->view.lock);
	/*
	 * Two AID keys are special: For 0x7d (enter) the input line
	 * has to be emitted to the tty and for 0x6d the screen
	 * needs to be redrawn.
	 */
	input = NULL;
	len = 0;
	switch (tp->input[0]) {
	case AID_ENTER:
		/* Enter: write input to tty. */
		input = tp->input + 6;
		len = tty3270_input_size(tp->view.cols) - 6 - rrq->rescnt;
		if (tp->inattr != TF_INPUTN)
			tty3270_rcl_add(tp, input, len);
		if (tp->nr_up > 0)
			tp->nr_up = 0;
		/* Clear input area. */
		tty3270_update_prompt(tp, "");
		tty3270_set_timer(tp, 1);
		break;
	case AID_CLEAR:
		/* Display has been cleared. Redraw. */
		tp->update_flags = TTY_UPDATE_ALL;
		tty3270_set_timer(tp, 1);
		if (!list_empty(&tp->readpartreq->list))
			break;
		raw3270_start_request(&tp->view, tp->readpartreq, TC_WRITESF,
				      (char *)sfq_read_partition, sizeof(sfq_read_partition));
		break;
	case AID_READ_PARTITION:
		raw3270_read_modified_cb(tp->readpartreq, tp->input);
		break;
	default:
		break;
	}
	spin_unlock_irq(&tp->view.lock);

	/* Start keyboard reset command. */
	raw3270_start_request(&tp->view, tp->kreset, TC_WRITE, &kreset_data, 1);

	while (len-- > 0)
		kbd_keycode(tp->kbd, *input++);
	/* Emit keycode for AID byte. */
	kbd_keycode(tp->kbd, 256 + tp->input[0]);

	raw3270_request_reset(rrq);
	xchg(&tp->read, rrq);
	raw3270_put_view(&tp->view);
}

/*
 * Read request completion callback.
 */
static void tty3270_read_callback(struct raw3270_request *rq, void *data)
{
	struct tty3270 *tp = container_of(rq->view, struct tty3270, view);

	raw3270_get_view(rq->view);
	/* Schedule tasklet to pass input to tty. */
	tasklet_schedule(&tp->readlet);
}

/*
 * Issue a read request. Call with device lock.
 */
static void tty3270_issue_read(struct tty3270 *tp, int lock)
{
	struct raw3270_request *rrq;
	int rc;

	rrq = xchg(&tp->read, 0);
	if (!rrq)
		/* Read already scheduled. */
		return;
	rrq->callback = tty3270_read_callback;
	rrq->callback_data = tp;
	raw3270_request_set_cmd(rrq, TC_READMOD);
	raw3270_request_set_data(rrq, tp->input, tty3270_input_size(tp->view.cols));
	/* Issue the read modified request. */
	if (lock)
		rc = raw3270_start(&tp->view, rrq);
	else
		rc = raw3270_start_irq(&tp->view, rrq);
	if (rc) {
		raw3270_request_reset(rrq);
		xchg(&tp->read, rrq);
	}
}

/*
 * Hang up the tty
 */
static void tty3270_hangup_tasklet(unsigned long data)
{
	struct tty3270 *tp = (struct tty3270 *)data;

	tty_port_tty_hangup(&tp->port, true);
	raw3270_put_view(&tp->view);
}

/*
 * Switch to the tty view.
 */
static int tty3270_activate(struct raw3270_view *view)
{
	struct tty3270 *tp = container_of(view, struct tty3270, view);

	tp->update_flags = TTY_UPDATE_ALL;
	tty3270_set_timer(tp, 1);
	return 0;
}

static void tty3270_deactivate(struct raw3270_view *view)
{
	struct tty3270 *tp = container_of(view, struct tty3270, view);

	del_timer(&tp->timer);
}

static void tty3270_irq(struct tty3270 *tp, struct raw3270_request *rq, struct irb *irb)
{
	/* Handle ATTN. Schedule tasklet to read aid. */
	if (irb->scsw.cmd.dstat & DEV_STAT_ATTENTION) {
		if (!tp->throttle)
			tty3270_issue_read(tp, 0);
		else
			tp->attn = 1;
	}

	if (rq) {
		if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK) {
			rq->rc = -EIO;
			raw3270_get_view(&tp->view);
			tasklet_schedule(&tp->hanglet);
		} else {
			/* Normal end. Copy residual count. */
			rq->rescnt = irb->scsw.cmd.count;
		}
	} else if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) {
		/* Interrupt without an outstanding request -> update all */
		tp->update_flags = TTY_UPDATE_ALL;
		tty3270_set_timer(tp, 1);
	}
}

/*
 * Allocate tty3270 structure.
 */
static struct tty3270 *tty3270_alloc_view(void)
{
	struct tty3270 *tp;

	tp = kzalloc(sizeof(*tp), GFP_KERNEL);
	if (!tp)
		goto out_err;

	tp->write = raw3270_request_alloc(TTY3270_OUTPUT_BUFFER_SIZE);
	if (IS_ERR(tp->write))
		goto out_tp;
	tp->read = raw3270_request_alloc(0);
	if (IS_ERR(tp->read))
		goto out_write;
	tp->kreset = raw3270_request_alloc(1);
	if (IS_ERR(tp->kreset))
		goto out_read;
	tp->readpartreq = raw3270_request_alloc(sizeof(sfq_read_partition));
	if (IS_ERR(tp->readpartreq))
		goto out_reset;
	tp->kbd = kbd_alloc();
	if (!tp->kbd)
		goto out_readpartreq;

	tty_port_init(&tp->port);
	timer_setup(&tp->timer, tty3270_update, 0);
	tasklet_init(&tp->readlet, tty3270_read_tasklet,
		     (unsigned long)tp->read);
	tasklet_init(&tp->hanglet, tty3270_hangup_tasklet,
		     (unsigned long)tp);
	return tp;

out_readpartreq:
	raw3270_request_free(tp->readpartreq);
out_reset:
	raw3270_request_free(tp->kreset);
out_read:
	raw3270_request_free(tp->read);
out_write:
	raw3270_request_free(tp->write);
out_tp:
	kfree(tp);
out_err:
	return ERR_PTR(-ENOMEM);
}

/*
 * Free tty3270 structure.
 */
static void tty3270_free_view(struct tty3270 *tp)
{
	kbd_free(tp->kbd);
	raw3270_request_free(tp->kreset);
	raw3270_request_free(tp->read);
	raw3270_request_free(tp->write);
	free_page((unsigned long)tp->converted_line);
	tty_port_destroy(&tp->port);
	kfree(tp);
}

/*
 * Allocate tty3270 screen.
 */
static struct tty3270_line *tty3270_alloc_screen(struct tty3270 *tp, unsigned int rows,
						 unsigned int cols, int *allocated_out)
{
	struct tty3270_line *screen;
	int allocated, lines;

	allocated = __roundup_pow_of_two(rows) * TTY3270_SCREEN_PAGES;
	screen = kcalloc(allocated, sizeof(struct tty3270_line), GFP_KERNEL);
	if (!screen)
		goto out_err;
	for (lines = 0; lines < allocated; lines++) {
		screen[lines].cells = kcalloc(cols, sizeof(struct tty3270_cell), GFP_KERNEL);
		if (!screen[lines].cells)
			goto out_screen;
	}
	*allocated_out = allocated;
	return screen;
out_screen:
	while (lines--)
		kfree(screen[lines].cells);
	kfree(screen);
out_err:
	return ERR_PTR(-ENOMEM);
}

static char **tty3270_alloc_recall(int cols)
{
	char **lines;
	int i;

	lines = kmalloc_array(TTY3270_RECALL_SIZE, sizeof(char *), GFP_KERNEL);
	if (!lines)
		return NULL;
	for (i = 0; i < TTY3270_RECALL_SIZE; i++) {
		lines[i] = kcalloc(1, tty3270_input_size(cols) + 1, GFP_KERNEL);
		if (!lines[i])
			break;
	}

	if (i == TTY3270_RECALL_SIZE)
		return lines;

	while (i--)
		kfree(lines[i]);
	kfree(lines);
	return NULL;
}

static void tty3270_free_recall(char **lines)
{
	int i;

	for (i = 0; i < TTY3270_RECALL_SIZE; i++)
		kfree(lines[i]);
	kfree(lines);
}

/*
 * Free tty3270 screen.
 */
static void tty3270_free_screen(struct tty3270_line *screen, int old_lines)
{
	int lines;

	for (lines = 0; lines < old_lines; lines++)
		kfree(screen[lines].cells);
	kfree(screen);
}

/*
 * Resize tty3270 screen
 */
static void tty3270_resize(struct raw3270_view *view,
			   int new_model, int new_rows, int new_cols,
			   int old_model, int old_rows, int old_cols)
{
	struct tty3270 *tp = container_of(view, struct tty3270, view);
	struct tty3270_line *screen, *oscreen;
	char **old_rcl_lines, **new_rcl_lines;
	char *old_prompt, *new_prompt;
	char *old_input, *new_input;
	struct tty_struct *tty;
	struct winsize ws;
	int new_allocated, old_allocated = tp->allocated_lines;

	if (old_model == new_model &&
	    old_cols == new_cols &&
	    old_rows == new_rows) {
		spin_lock_irq(&tp->view.lock);
		tty3270_redraw(tp);
		spin_unlock_irq(&tp->view.lock);
		return;
	}

	new_input = kzalloc(tty3270_input_size(new_cols), GFP_KERNEL | GFP_DMA);
	if (!new_input)
		return;
	new_prompt = kzalloc(tty3270_input_size(new_cols), GFP_KERNEL);
	if (!new_prompt)
		goto out_input;
	screen = tty3270_alloc_screen(tp, new_rows, new_cols, &new_allocated);
	if (IS_ERR(screen))
		goto out_prompt;
	new_rcl_lines = tty3270_alloc_recall(new_cols);
	if (!new_rcl_lines)
		goto out_screen;

	/* Switch to new output size */
	spin_lock_irq(&tp->view.lock);
	tty3270_blank_screen(tp);
	oscreen = tp->screen;
	tp->screen = screen;
	tp->allocated_lines = new_allocated;
	tp->view.rows = new_rows;
	tp->view.cols = new_cols;
	tp->view.model = new_model;
	tp->update_flags = TTY_UPDATE_ALL;
	old_input = tp->input;
	old_prompt = tp->prompt;
	old_rcl_lines = tp->rcl_lines;
	tp->input = new_input;
	tp->prompt = new_prompt;
	tp->rcl_lines = new_rcl_lines;
	tp->rcl_read_index = 0;
	tp->rcl_write_index = 0;
	spin_unlock_irq(&tp->view.lock);
	tty3270_free_screen(oscreen, old_allocated);
	kfree(old_input);
	kfree(old_prompt);
	tty3270_free_recall(old_rcl_lines);
	tty3270_set_timer(tp, 1);
	/* Informat tty layer about new size */
	tty = tty_port_tty_get(&tp->port);
	if (!tty)
		return;
	ws.ws_row = tty3270_tty_rows(tp);
	ws.ws_col = tp->view.cols;
	tty_do_resize(tty, &ws);
	tty_kref_put(tty);
	return;
out_screen:
	tty3270_free_screen(screen, new_rows);
out_prompt:
	kfree(new_prompt);
out_input:
	kfree(new_input);
}

/*
 * Unlink tty3270 data structure from tty.
 */
static void tty3270_release(struct raw3270_view *view)
{
	struct tty3270 *tp = container_of(view, struct tty3270, view);
	struct tty_struct *tty = tty_port_tty_get(&tp->port);

	if (tty) {
		tty->driver_data = NULL;
		tty_port_tty_set(&tp->port, NULL);
		tty_hangup(tty);
		raw3270_put_view(&tp->view);
		tty_kref_put(tty);
	}
}

/*
 * Free tty3270 data structure
 */
static void tty3270_free(struct raw3270_view *view)
{
	struct tty3270 *tp = container_of(view, struct tty3270, view);

	del_timer_sync(&tp->timer);
	tty3270_free_screen(tp->screen, tp->allocated_lines);
	free_page((unsigned long)tp->converted_line);
	kfree(tp->input);
	kfree(tp->prompt);
	tty3270_free_view(tp);
}

/*
 * Delayed freeing of tty3270 views.
 */
static void tty3270_del_views(void)
{
	int i;

	for (i = RAW3270_FIRSTMINOR; i <= tty3270_max_index; i++) {
		struct raw3270_view *view = raw3270_find_view(&tty3270_fn, i);

		if (!IS_ERR(view))
			raw3270_del_view(view);
	}
}

static struct raw3270_fn tty3270_fn = {
	.activate = tty3270_activate,
	.deactivate = tty3270_deactivate,
	.intv = (void *)tty3270_irq,
	.release = tty3270_release,
	.free = tty3270_free,
	.resize = tty3270_resize
};

static int
tty3270_create_view(int index, struct tty3270 **newtp)
{
	struct tty3270 *tp;
	int rc;

	if (tty3270_max_index < index + 1)
		tty3270_max_index = index + 1;

	/* Allocate tty3270 structure on first open. */
	tp = tty3270_alloc_view();
	if (IS_ERR(tp))
		return PTR_ERR(tp);

	rc = raw3270_add_view(&tp->view, &tty3270_fn,
			      index + RAW3270_FIRSTMINOR,
			      RAW3270_VIEW_LOCK_IRQ);
	if (rc)
		goto out_free_view;

	tp->screen = tty3270_alloc_screen(tp, tp->view.rows, tp->view.cols,
					  &tp->allocated_lines);
	if (IS_ERR(tp->screen)) {
		rc = PTR_ERR(tp->screen);
		goto out_put_view;
	}

	tp->converted_line = (void *)__get_free_page(GFP_KERNEL);
	if (!tp->converted_line) {
		rc = -ENOMEM;
		goto out_free_screen;
	}

	tp->input = kzalloc(tty3270_input_size(tp->view.cols), GFP_KERNEL | GFP_DMA);
	if (!tp->input) {
		rc = -ENOMEM;
		goto out_free_converted_line;
	}

	tp->prompt = kzalloc(tty3270_input_size(tp->view.cols), GFP_KERNEL);
	if (!tp->prompt) {
		rc = -ENOMEM;
		goto out_free_input;
	}

	tp->rcl_lines = tty3270_alloc_recall(tp->view.cols);
	if (!tp->rcl_lines) {
		rc = -ENOMEM;
		goto out_free_prompt;
	}

	/* Create blank line for every line in the tty output area. */
	tty3270_blank_screen(tp);

	tp->kbd->port = &tp->port;
	tp->kbd->fn_handler[KVAL(K_INCRCONSOLE)] = tty3270_exit_tty;
	tp->kbd->fn_handler[KVAL(K_SCROLLBACK)] = tty3270_scroll_backward;
	tp->kbd->fn_handler[KVAL(K_SCROLLFORW)] = tty3270_scroll_forward;
	tp->kbd->fn_handler[KVAL(K_CONS)] = tty3270_rcl_backward;
	kbd_ascebc(tp->kbd, tp->view.ascebc);

	raw3270_activate_view(&tp->view);
	raw3270_put_view(&tp->view);
	*newtp = tp;
	return 0;

out_free_prompt:
	kfree(tp->prompt);
out_free_input:
	kfree(tp->input);
out_free_converted_line:
	free_page((unsigned long)tp->converted_line);
out_free_screen:
	tty3270_free_screen(tp->screen, tp->view.rows);
out_put_view:
	raw3270_put_view(&tp->view);
	raw3270_del_view(&tp->view);
out_free_view:
	tty3270_free_view(tp);
	return rc;
}

/*
 * This routine is called whenever a 3270 tty is opened first time.
 */
static int
tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
{
	struct raw3270_view *view;
	struct tty3270 *tp;
	int rc;

	/* Check if the tty3270 is already there. */
	view = raw3270_find_view(&tty3270_fn, tty->index + RAW3270_FIRSTMINOR);
	if (IS_ERR(view)) {
		rc = tty3270_create_view(tty->index, &tp);
		if (rc)
			return rc;
	} else {
		tp = container_of(view, struct tty3270, view);
		tty->driver_data = tp;
		tp->inattr = TF_INPUT;
	}

	tty->winsize.ws_row = tty3270_tty_rows(tp);
	tty->winsize.ws_col = tp->view.cols;
	rc = tty_port_install(&tp->port, driver, tty);
	if (rc) {
		raw3270_put_view(&tp->view);
		return rc;
	}
	tty->driver_data = tp;
	return 0;
}

/*
 * This routine is called whenever a 3270 tty is opened.
 */
static int tty3270_open(struct tty_struct *tty, struct file *filp)
{
	struct tty3270 *tp = tty->driver_data;
	struct tty_port *port = &tp->port;

	port->count++;
	tty_port_tty_set(port, tty);
	return 0;
}

/*
 * This routine is called when the 3270 tty is closed. We wait
 * for the remaining request to be completed. Then we clean up.
 */
static void tty3270_close(struct tty_struct *tty, struct file *filp)
{
	struct tty3270 *tp = tty->driver_data;

	if (tty->count > 1)
		return;
	if (tp)
		tty_port_tty_set(&tp->port, NULL);
}

static void tty3270_cleanup(struct tty_struct *tty)
{
	struct tty3270 *tp = tty->driver_data;

	if (tp) {
		tty->driver_data = NULL;
		raw3270_put_view(&tp->view);
	}
}

/*
 * We always have room.
 */
static unsigned int tty3270_write_room(struct tty_struct *tty)
{
	return INT_MAX;
}

/*
 * Insert character into the screen at the current position with the
 * current color and highlight. This function does NOT do cursor movement.
 */
static void tty3270_put_character(struct tty3270 *tp, char ch)
{
	struct tty3270_line *line;
	struct tty3270_cell *cell;

	line = tty3270_get_write_line(tp, tp->cy);
	if (line->len <= tp->cx) {
		while (line->len < tp->cx) {
			cell = line->cells + line->len;
			cell->character = ' ';
			cell->attributes = tp->attributes;
			line->len++;
		}
		line->len++;
	}
	cell = line->cells + tp->cx;
	cell->character = ch;
	cell->attributes = tp->attributes;
	line->dirty = 1;
}

/*
 * Do carriage return.
 */
static void tty3270_cr(struct tty3270 *tp)
{
	tp->cx = 0;
}

/*
 * Do line feed.
 */
static void tty3270_lf(struct tty3270 *tp)
{
	struct tty3270_line *line;
	int i;

	if (tp->cy < tty3270_tty_rows(tp) - 1) {
		tp->cy++;
	} else {
		tp->line_view_start = tty3270_line_increment(tp, tp->line_view_start, 1);
		tp->line_write_start = tty3270_line_increment(tp, tp->line_write_start, 1);
		for (i = 0; i < tty3270_tty_rows(tp); i++)
			tty3270_get_view_line(tp, i)->dirty = 1;
	}

	line = tty3270_get_write_line(tp, tp->cy);
	line->len = 0;
	line->dirty = 1;
}

static void tty3270_ri(struct tty3270 *tp)
{
	if (tp->cy > 0)
		tp->cy--;
}

static void tty3270_reset_cell(struct tty3270 *tp, struct tty3270_cell *cell)
{
	cell->character = ' ';
	tty3270_reset_attributes(&cell->attributes);
}

/*
 * Insert characters at current position.
 */
static void tty3270_insert_characters(struct tty3270 *tp, int n)
{
	struct tty3270_line *line;
	int k;

	line = tty3270_get_write_line(tp, tp->cy);
	while (line->len < tp->cx)
		tty3270_reset_cell(tp, &line->cells[line->len++]);
	if (n > tp->view.cols - tp->cx)
		n = tp->view.cols - tp->cx;
	k = min_t(int, line->len - tp->cx, tp->view.cols - tp->cx - n);
	while (k--)
		line->cells[tp->cx + n + k] = line->cells[tp->cx + k];
	line->len += n;
	if (line->len > tp->view.cols)
		line->len = tp->view.cols;
	while (n-- > 0) {
		line->cells[tp->cx + n].character = ' ';
		line->cells[tp->cx + n].attributes = tp->attributes;
	}
}

/*
 * Delete characters at current position.
 */
static void tty3270_delete_characters(struct tty3270 *tp, int n)
{
	struct tty3270_line *line;
	int i;

	line = tty3270_get_write_line(tp, tp->cy);
	if (line->len <= tp->cx)
		return;
	if (line->len - tp->cx <= n) {
		line->len = tp->cx;
		return;
	}
	for (i = tp->cx; i + n < line->len; i++)
		line->cells[i] = line->cells[i + n];
	line->len -= n;
}

/*
 * Erase characters at current position.
 */
static void tty3270_erase_characters(struct tty3270 *tp, int n)
{
	struct tty3270_line *line;
	struct tty3270_cell *cell;

	line = tty3270_get_write_line(tp, tp->cy);
	while (line->len > tp->cx && n-- > 0) {
		cell = line->cells + tp->cx++;
		tty3270_reset_cell(tp, cell);
	}
	tp->cx += n;
	tp->cx = min_t(int, tp->cx, tp->view.cols - 1);
}

/*
 * Erase line, 3 different cases:
 *  Esc [ 0 K	Erase from current position to end of line inclusive
 *  Esc [ 1 K	Erase from beginning of line to current position inclusive
 *  Esc [ 2 K	Erase entire line (without moving cursor)
 */
static void tty3270_erase_line(struct tty3270 *tp, int mode)
{
	struct tty3270_line *line;
	struct tty3270_cell *cell;
	int i, start, end;

	line = tty3270_get_write_line(tp, tp->cy);

	switch (mode) {
	case 0:
		start = tp->cx;
		end = tp->view.cols;
		break;
	case 1:
		start = 0;
		end = tp->cx;
		break;
	case 2:
		start = 0;
		end = tp->view.cols;
		break;
	default:
		return;
	}

	for (i = start; i < end; i++) {
		cell = line->cells + i;
		tty3270_reset_cell(tp, cell);
		cell->attributes.b_color = tp->attributes.b_color;
	}

	if (line->len <= end)
		line->len = end;
}

/*
 * Erase display, 3 different cases:
 *  Esc [ 0 J	Erase from current position to bottom of screen inclusive
 *  Esc [ 1 J	Erase from top of screen to current position inclusive
 *  Esc [ 2 J	Erase entire screen (without moving the cursor)
 */
static void tty3270_erase_display(struct tty3270 *tp, int mode)
{
	struct tty3270_line *line;
	int i, start, end;

	switch (mode) {
	case 0:
		tty3270_erase_line(tp, 0);
		start = tp->cy + 1;
		end = tty3270_tty_rows(tp);
		break;
	case 1:
		start = 0;
		end = tp->cy;
		tty3270_erase_line(tp, 1);
		break;
	case 2:
		start = 0;
		end = tty3270_tty_rows(tp);
		break;
	default:
		return;
	}
	for (i = start; i < end; i++) {
		line = tty3270_get_write_line(tp, i);
		line->len = 0;
		line->dirty = 1;
	}
}

/*
 * Set attributes found in an escape sequence.
 *  Esc [ <attr> ; <attr> ; ... m
 */
static void tty3270_set_attributes(struct tty3270 *tp)
{
	int i, attr;

	for (i = 0; i <= tp->esc_npar; i++) {
		attr = tp->esc_par[i];
		switch (attr) {
		case 0:		/* Reset */
			tty3270_reset_attributes(&tp->attributes);
			break;
		/* Highlight. */
		case 4:		/* Start underlining. */
			tp->attributes.highlight = TTY3270_HIGHLIGHT_UNDERSCORE;
			break;
		case 5:		/* Start blink. */
			tp->attributes.highlight = TTY3270_HIGHLIGHT_BLINK;
			break;
		case 7:		/* Start reverse. */
			tp->attributes.highlight = TTY3270_HIGHLIGHT_REVERSE;
			break;
		case 24:	/* End underlining */
			tp->attributes.highlight &= ~TTY3270_HIGHLIGHT_UNDERSCORE;
			break;
		case 25:	/* End blink. */
			tp->attributes.highlight &= ~TTY3270_HIGHLIGHT_BLINK;
			break;
		case 27:	/* End reverse. */
			tp->attributes.highlight &= ~TTY3270_HIGHLIGHT_REVERSE;
			break;
		/* Foreground color. */
		case 30:	/* Black */
		case 31:	/* Red */
		case 32:	/* Green */
		case 33:	/* Yellow */
		case 34:	/* Blue */
		case 35:	/* Magenta */
		case 36:	/* Cyan */
		case 37:	/* White */
		case 39:	/* Black */
			tp->attributes.f_color = attr - 30;
			break;
		/* Background color. */
		case 40:	/* Black */
		case 41:	/* Red */
		case 42:	/* Green */
		case 43:	/* Yellow */
		case 44:	/* Blue */
		case 45:	/* Magenta */
		case 46:	/* Cyan */
		case 47:	/* White */
		case 49:	/* Black */
			tp->attributes.b_color = attr - 40;
			break;
		}
	}
}

static inline int tty3270_getpar(struct tty3270 *tp, int ix)
{
	return (tp->esc_par[ix] > 0) ? tp->esc_par[ix] : 1;
}

static void tty3270_goto_xy(struct tty3270 *tp, int cx, int cy)
{
	struct tty3270_line *line;
	struct tty3270_cell *cell;
	int max_cx = max(0, cx);
	int max_cy = max(0, cy);

	tp->cx = min_t(int, tp->view.cols - 1, max_cx);
	line = tty3270_get_write_line(tp, tp->cy);
	while (line->len < tp->cx) {
		cell = line->cells + line->len;
		cell->character = ' ';
		cell->attributes = tp->attributes;
		line->len++;
	}
	tp->cy = min_t(int, tty3270_tty_rows(tp) - 1, max_cy);
}

/*
 * Process escape sequences. Known sequences:
 *  Esc 7			Save Cursor Position
 *  Esc 8			Restore Cursor Position
 *  Esc [ Pn ; Pn ; .. m	Set attributes
 *  Esc [ Pn ; Pn H		Cursor Position
 *  Esc [ Pn ; Pn f		Cursor Position
 *  Esc [ Pn A			Cursor Up
 *  Esc [ Pn B			Cursor Down
 *  Esc [ Pn C			Cursor Forward
 *  Esc [ Pn D			Cursor Backward
 *  Esc [ Pn G			Cursor Horizontal Absolute
 *  Esc [ Pn X			Erase Characters
 *  Esc [ Ps J			Erase in Display
 *  Esc [ Ps K			Erase in Line
 * // FIXME: add all the new ones.
 *
 *  Pn is a numeric parameter, a string of zero or more decimal digits.
 *  Ps is a selective parameter.
 */
static void tty3270_escape_sequence(struct tty3270 *tp, char ch)
{
	enum { ES_NORMAL, ES_ESC, ES_SQUARE, ES_PAREN, ES_GETPARS };

	if (tp->esc_state == ES_NORMAL) {
		if (ch == 0x1b)
			/* Starting new escape sequence. */
			tp->esc_state = ES_ESC;
		return;
	}
	if (tp->esc_state == ES_ESC) {
		tp->esc_state = ES_NORMAL;
		switch (ch) {
		case '[':
			tp->esc_state = ES_SQUARE;
			break;
		case '(':
			tp->esc_state = ES_PAREN;
			break;
		case 'E':
			tty3270_cr(tp);
			tty3270_lf(tp);
			break;
		case 'M':
			tty3270_ri(tp);
			break;
		case 'D':
			tty3270_lf(tp);
			break;
		case 'Z':		/* Respond ID. */
			kbd_puts_queue(&tp->port, "\033[?6c");
			break;
		case '7':		/* Save cursor position. */
			tp->saved_cx = tp->cx;
			tp->saved_cy = tp->cy;
			tp->saved_attributes = tp->attributes;
			break;
		case '8':		/* Restore cursor position. */
			tty3270_goto_xy(tp, tp->saved_cx, tp->saved_cy);
			tp->attributes = tp->saved_attributes;
			break;
		case 'c':		/* Reset terminal. */
			tp->cx = 0;
			tp->cy = 0;
			tp->saved_cx = 0;
			tp->saved_cy = 0;
			tty3270_reset_attributes(&tp->attributes);
			tty3270_reset_attributes(&tp->saved_attributes);
			tty3270_erase_display(tp, 2);
			break;
		}
		return;
	}

	switch (tp->esc_state) {
	case ES_PAREN:
		tp->esc_state = ES_NORMAL;
		switch (ch) {
		case 'B':
			tp->attributes.alternate_charset = 0;
			break;
		case '0':
			tp->attributes.alternate_charset = 1;
			break;
		}
		return;
	case ES_SQUARE:
		tp->esc_state = ES_GETPARS;
		memset(tp->esc_par, 0, sizeof(tp->esc_par));
		tp->esc_npar = 0;
		tp->esc_ques = (ch == '?');
		if (tp->esc_ques)
			return;
		fallthrough;
	case ES_GETPARS:
		if (ch == ';' && tp->esc_npar < ESCAPE_NPAR - 1) {
			tp->esc_npar++;
			return;
		}
		if (ch >= '0' && ch <= '9') {
			tp->esc_par[tp->esc_npar] *= 10;
			tp->esc_par[tp->esc_npar] += ch - '0';
			return;
		}
		break;
	default:
		break;
	}
	tp->esc_state = ES_NORMAL;
	if (ch == 'n' && !tp->esc_ques) {
		if (tp->esc_par[0] == 5)		/* Status report. */
			kbd_puts_queue(&tp->port, "\033[0n");
		else if (tp->esc_par[0] == 6) {	/* Cursor report. */
			char buf[40];

			sprintf(buf, "\033[%d;%dR", tp->cy + 1, tp->cx + 1);
			kbd_puts_queue(&tp->port, buf);
		}
		return;
	}
	if (tp->esc_ques)
		return;
	switch (ch) {
	case 'm':
		tty3270_set_attributes(tp);
		break;
	case 'H':	/* Set cursor position. */
	case 'f':
		tty3270_goto_xy(tp, tty3270_getpar(tp, 1) - 1,
				tty3270_getpar(tp, 0) - 1);
		break;
	case 'd':	/* Set y position. */
		tty3270_goto_xy(tp, tp->cx, tty3270_getpar(tp, 0) - 1);
		break;
	case 'A':	/* Cursor up. */
	case 'F':
		tty3270_goto_xy(tp, tp->cx, tp->cy - tty3270_getpar(tp, 0));
		break;
	case 'B':	/* Cursor down. */
	case 'e':
	case 'E':
		tty3270_goto_xy(tp, tp->cx, tp->cy + tty3270_getpar(tp, 0));
		break;
	case 'C':	/* Cursor forward. */
	case 'a':
		tty3270_goto_xy(tp, tp->cx + tty3270_getpar(tp, 0), tp->cy);
		break;
	case 'D':	/* Cursor backward. */
		tty3270_goto_xy(tp, tp->cx - tty3270_getpar(tp, 0), tp->cy);
		break;
	case 'G':	/* Set x position. */
	case '`':
		tty3270_goto_xy(tp, tty3270_getpar(tp, 0), tp->cy);
		break;
	case 'X':	/* Erase Characters. */
		tty3270_erase_characters(tp, tty3270_getpar(tp, 0));
		break;
	case 'J':	/* Erase display. */
		tty3270_erase_display(tp, tp->esc_par[0]);
		break;
	case 'K':	/* Erase line. */
		tty3270_erase_line(tp, tp->esc_par[0]);
		break;
	case 'P':	/* Delete characters. */
		tty3270_delete_characters(tp, tty3270_getpar(tp, 0));
		break;
	case '@':	/* Insert characters. */
		tty3270_insert_characters(tp, tty3270_getpar(tp, 0));
		break;
	case 's':	/* Save cursor position. */
		tp->saved_cx = tp->cx;
		tp->saved_cy = tp->cy;
		tp->saved_attributes = tp->attributes;
		break;
	case 'u':	/* Restore cursor position. */
		tty3270_goto_xy(tp, tp->saved_cx, tp->saved_cy);
		tp->attributes = tp->saved_attributes;
		break;
	}
}

/*
 * String write routine for 3270 ttys
 */
static void tty3270_do_write(struct tty3270 *tp, struct tty_struct *tty,
			     const unsigned char *buf, int count)
{
	int i_msg, i;

	spin_lock_irq(&tp->view.lock);
	for (i_msg = 0; !tty->flow.stopped && i_msg < count; i_msg++) {
		if (tp->esc_state != 0) {
			/* Continue escape sequence. */
			tty3270_escape_sequence(tp, buf[i_msg]);
			continue;
		}

		switch (buf[i_msg]) {
		case 0x00:
			break;
		case 0x07:		/* '\a' -- Alarm */
			tp->wcc |= TW_PLUSALARM;
			break;
		case 0x08:		/* Backspace. */
			if (tp->cx > 0) {
				tp->cx--;
				tty3270_put_character(tp, ' ');
			}
			break;
		case 0x09:		/* '\t' -- Tabulate */
			for (i = tp->cx % 8; i < 8; i++) {
				if (tp->cx >= tp->view.cols) {
					tty3270_cr(tp);
					tty3270_lf(tp);
					break;
				}
				tty3270_put_character(tp, ' ');
				tp->cx++;
			}
			break;
		case 0x0a:		/* '\n' -- New Line */
			tty3270_cr(tp);
			tty3270_lf(tp);
			break;
		case 0x0c:		/* '\f' -- Form Feed */
			tty3270_erase_display(tp, 2);
			tp->cx = 0;
			tp->cy = 0;
			break;
		case 0x0d:		/* '\r' -- Carriage Return */
			tp->cx = 0;
			break;
		case 0x0e:
			tp->attributes.alternate_charset = 1;
			break;
		case 0x0f:		/* SuSE "exit alternate mode" */
			tp->attributes.alternate_charset = 0;
			break;
		case 0x1b:		/* Start escape sequence. */
			tty3270_escape_sequence(tp, buf[i_msg]);
			break;
		default:		/* Insert normal character. */
			if (tp->cx >= tp->view.cols) {
				tty3270_cr(tp);
				tty3270_lf(tp);
			}
			tty3270_put_character(tp, buf[i_msg]);
			tp->cx++;
			break;
		}
	}
	/* Setup timer to update display after 1/10 second */
	tp->update_flags |= TTY_UPDATE_LINES;
	if (!timer_pending(&tp->timer))
		tty3270_set_timer(tp, msecs_to_jiffies(100));

	spin_unlock_irq(&tp->view.lock);
}

/*
 * String write routine for 3270 ttys
 */
static int tty3270_write(struct tty_struct *tty,
			 const unsigned char *buf, int count)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return 0;
	if (tp->char_count > 0) {
		tty3270_do_write(tp, tty, tp->char_buf, tp->char_count);
		tp->char_count = 0;
	}
	tty3270_do_write(tp, tty, buf, count);
	return count;
}

/*
 * Put single characters to the ttys character buffer
 */
static int tty3270_put_char(struct tty_struct *tty, unsigned char ch)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp || tp->char_count >= TTY3270_CHAR_BUF_SIZE)
		return 0;
	tp->char_buf[tp->char_count++] = ch;
	return 1;
}

/*
 * Flush all characters from the ttys characeter buffer put there
 * by tty3270_put_char.
 */
static void tty3270_flush_chars(struct tty_struct *tty)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return;
	if (tp->char_count > 0) {
		tty3270_do_write(tp, tty, tp->char_buf, tp->char_count);
		tp->char_count = 0;
	}
}

/*
 * Check for visible/invisible input switches
 */
static void tty3270_set_termios(struct tty_struct *tty, const struct ktermios *old)
{
	struct tty3270 *tp;
	int new;

	tp = tty->driver_data;
	if (!tp)
		return;
	spin_lock_irq(&tp->view.lock);
	if (L_ICANON(tty)) {
		new = L_ECHO(tty) ? TF_INPUT : TF_INPUTN;
		if (new != tp->inattr) {
			tp->inattr = new;
			tty3270_update_prompt(tp, "");
			tty3270_set_timer(tp, 1);
		}
	}
	spin_unlock_irq(&tp->view.lock);
}

/*
 * Disable reading from a 3270 tty
 */
static void tty3270_throttle(struct tty_struct *tty)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return;
	tp->throttle = 1;
}

/*
 * Enable reading from a 3270 tty
 */
static void tty3270_unthrottle(struct tty_struct *tty)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return;
	tp->throttle = 0;
	if (tp->attn)
		tty3270_issue_read(tp, 1);
}

/*
 * Hang up the tty device.
 */
static void tty3270_hangup(struct tty_struct *tty)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return;
	spin_lock_irq(&tp->view.lock);
	tp->cx = 0;
	tp->cy = 0;
	tp->saved_cx = 0;
	tp->saved_cy = 0;
	tty3270_reset_attributes(&tp->attributes);
	tty3270_reset_attributes(&tp->saved_attributes);
	tty3270_blank_screen(tp);
	tp->update_flags = TTY_UPDATE_ALL;
	spin_unlock_irq(&tp->view.lock);
	tty3270_set_timer(tp, 1);
}

static void tty3270_wait_until_sent(struct tty_struct *tty, int timeout)
{
}

static int tty3270_ioctl(struct tty_struct *tty, unsigned int cmd,
			 unsigned long arg)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return -ENODEV;
	if (tty_io_error(tty))
		return -EIO;
	return kbd_ioctl(tp->kbd, cmd, arg);
}

#ifdef CONFIG_COMPAT
static long tty3270_compat_ioctl(struct tty_struct *tty,
				 unsigned int cmd, unsigned long arg)
{
	struct tty3270 *tp;

	tp = tty->driver_data;
	if (!tp)
		return -ENODEV;
	if (tty_io_error(tty))
		return -EIO;
	return kbd_ioctl(tp->kbd, cmd, (unsigned long)compat_ptr(arg));
}
#endif

static const struct tty_operations tty3270_ops = {
	.install = tty3270_install,
	.cleanup = tty3270_cleanup,
	.open = tty3270_open,
	.close = tty3270_close,
	.write = tty3270_write,
	.put_char = tty3270_put_char,
	.flush_chars = tty3270_flush_chars,
	.write_room = tty3270_write_room,
	.throttle = tty3270_throttle,
	.unthrottle = tty3270_unthrottle,
	.hangup = tty3270_hangup,
	.wait_until_sent = tty3270_wait_until_sent,
	.ioctl = tty3270_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl = tty3270_compat_ioctl,
#endif
	.set_termios = tty3270_set_termios
};

static void tty3270_create_cb(int minor)
{
	tty_register_device(tty3270_driver, minor - RAW3270_FIRSTMINOR, NULL);
}

static void tty3270_destroy_cb(int minor)
{
	tty_unregister_device(tty3270_driver, minor - RAW3270_FIRSTMINOR);
}

static struct raw3270_notifier tty3270_notifier = {
	.create = tty3270_create_cb,
	.destroy = tty3270_destroy_cb,
};

/*
 * 3270 tty registration code called from tty_init().
 * Most kernel services (incl. kmalloc) are available at this poimt.
 */
static int __init tty3270_init(void)
{
	struct tty_driver *driver;
	int ret;

	driver = tty_alloc_driver(RAW3270_MAXDEVS,
				  TTY_DRIVER_REAL_RAW |
				  TTY_DRIVER_DYNAMIC_DEV |
				  TTY_DRIVER_RESET_TERMIOS);
	if (IS_ERR(driver))
		return PTR_ERR(driver);

	/*
	 * Initialize the tty_driver structure
	 * Entries in tty3270_driver that are NOT initialized:
	 * proc_entry, set_termios, flush_buffer, set_ldisc, write_proc
	 */
	driver->driver_name = "tty3270";
	driver->name = "3270/tty";
	driver->major = IBM_TTY3270_MAJOR;
	driver->minor_start = RAW3270_FIRSTMINOR;
	driver->name_base = RAW3270_FIRSTMINOR;
	driver->type = TTY_DRIVER_TYPE_SYSTEM;
	driver->subtype = SYSTEM_TYPE_TTY;
	driver->init_termios = tty_std_termios;
	tty_set_operations(driver, &tty3270_ops);
	ret = tty_register_driver(driver);
	if (ret) {
		tty_driver_kref_put(driver);
		return ret;
	}
	tty3270_driver = driver;
	raw3270_register_notifier(&tty3270_notifier);
	return 0;
}

static void __exit tty3270_exit(void)
{
	struct tty_driver *driver;

	raw3270_unregister_notifier(&tty3270_notifier);
	driver = tty3270_driver;
	tty3270_driver = NULL;
	tty_unregister_driver(driver);
	tty_driver_kref_put(driver);
	tty3270_del_views();
}

#if IS_ENABLED(CONFIG_TN3270_CONSOLE)

static struct tty3270 *condev;

static void
con3270_write(struct console *co, const char *str, unsigned int count)
{
	struct tty3270 *tp = co->data;
	unsigned long flags;
	char c;

	spin_lock_irqsave(&tp->view.lock, flags);
	while (count--) {
		c = *str++;
		if (c == 0x0a) {
			tty3270_cr(tp);
			tty3270_lf(tp);
		} else {
			if (tp->cx >= tp->view.cols) {
				tty3270_cr(tp);
				tty3270_lf(tp);
			}
			tty3270_put_character(tp, c);
			tp->cx++;
		}
	}
	spin_unlock_irqrestore(&tp->view.lock, flags);
}

static struct tty_driver *
con3270_device(struct console *c, int *index)
{
	*index = c->index;
	return tty3270_driver;
}

static void
con3270_wait_write(struct tty3270 *tp)
{
	while (!tp->write) {
		raw3270_wait_cons_dev(tp->view.dev);
		barrier();
	}
}

/*
 * The below function is called as a panic/reboot notifier before the
 * system enters a disabled, endless loop.
 *
 * Notice we must use the spin_trylock() alternative, to prevent lockups
 * in atomic context (panic routine runs with secondary CPUs, local IRQs
 * and preemption disabled).
 */
static int con3270_notify(struct notifier_block *self,
			  unsigned long event, void *data)
{
	struct tty3270 *tp;
	unsigned long flags;
	int rc;

	tp = condev;
	if (!tp->view.dev)
		return NOTIFY_DONE;
	if (!raw3270_view_lock_unavailable(&tp->view)) {
		rc = raw3270_activate_view(&tp->view);
		if (rc)
			return NOTIFY_DONE;
	}
	if (!spin_trylock_irqsave(&tp->view.lock, flags))
		return NOTIFY_DONE;
	con3270_wait_write(tp);
	tp->nr_up = 0;
	tp->update_flags = TTY_UPDATE_ALL;
	while (tp->update_flags != 0) {
		spin_unlock_irqrestore(&tp->view.lock, flags);
		tty3270_update(&tp->timer);
		spin_lock_irqsave(&tp->view.lock, flags);
		con3270_wait_write(tp);
	}
	spin_unlock_irqrestore(&tp->view.lock, flags);
	return NOTIFY_DONE;
}

static struct notifier_block on_panic_nb = {
	.notifier_call = con3270_notify,
	.priority = INT_MIN + 1, /* run the callback late */
};

static struct notifier_block on_reboot_nb = {
	.notifier_call = con3270_notify,
	.priority = INT_MIN + 1, /* run the callback late */
};

static struct console con3270 = {
	.name	 = "tty3270",
	.write	 = con3270_write,
	.device	 = con3270_device,
	.flags	 = CON_PRINTBUFFER,
};

static int __init
con3270_init(void)
{
	struct raw3270_view *view;
	struct raw3270 *rp;
	struct tty3270 *tp;
	int rc;

	/* Check if 3270 is to be the console */
	if (!CONSOLE_IS_3270)
		return -ENODEV;

	/* Set the console mode for VM */
	if (MACHINE_IS_VM) {
		cpcmd("TERM CONMODE 3270", NULL, 0, NULL);
		cpcmd("TERM AUTOCR OFF", NULL, 0, NULL);
	}

	rp = raw3270_setup_console();
	if (IS_ERR(rp))
		return PTR_ERR(rp);

	/* Check if the tty3270 is already there. */
	view = raw3270_find_view(&tty3270_fn, RAW3270_FIRSTMINOR);
	if (IS_ERR(view)) {
		rc = tty3270_create_view(0, &tp);
		if (rc)
			return rc;
	} else {
		tp = container_of(view, struct tty3270, view);
		tp->inattr = TF_INPUT;
	}
	con3270.data = tp;
	condev = tp;
	atomic_notifier_chain_register(&panic_notifier_list, &on_panic_nb);
	register_reboot_notifier(&on_reboot_nb);
	register_console(&con3270);
	return 0;
}
console_initcall(con3270_init);
#endif

MODULE_LICENSE("GPL");
MODULE_ALIAS_CHARDEV_MAJOR(IBM_TTY3270_MAJOR);

module_init(tty3270_init);
module_exit(tty3270_exit);
