Commit 164eb669 authored by Sven Schnelle's avatar Sven Schnelle Committed by Heiko Carstens

s390/tty3270: use normal char buffer for prompt/input

Preparation patch to allow removing the custom 3270 memory allocator.
Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Tested-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent 9c138af9
...@@ -100,8 +100,8 @@ struct tty3270 { ...@@ -100,8 +100,8 @@ struct tty3270 {
struct tty3270_line *screen; struct tty3270_line *screen;
/* Input stuff. */ /* Input stuff. */
struct string *prompt; /* Output string for input area. */ char *prompt; /* Output string for input area. */
struct string *input; /* Input string for read request. */ char *input; /* Input string for read request. */
struct raw3270_request *read; /* Single read request. */ struct raw3270_request *read; /* Single read request. */
struct raw3270_request *kreset; /* Single keyboard reset request. */ struct raw3270_request *kreset; /* Single keyboard reset request. */
struct raw3270_request *readpartreq; struct raw3270_request *readpartreq;
...@@ -198,53 +198,44 @@ static struct tty3270_line *tty3270_get_view_line(struct tty3270 *tp, unsigned i ...@@ -198,53 +198,44 @@ static struct tty3270_line *tty3270_get_view_line(struct tty3270 *tp, unsigned i
return tp->screen + tty3270_line_increment(tp, tp->line_view_start, num - tp->nr_up); return tp->screen + tty3270_line_increment(tp, tp->line_view_start, num - tp->nr_up);
} }
/* static int tty3270_input_size(int cols)
* The input line are the two last lines of the screen.
*/
static void tty3270_update_prompt(struct tty3270 *tp, char *input, int count)
{ {
struct string *line; return cols * 2 - 11;
}
line = tp->prompt; static void tty3270_update_prompt(struct tty3270 *tp, char *input, int count)
if (count != 0) {
line->string[5] = TF_INMDT; memcpy(tp->prompt, input, count);
else tp->prompt[count] = '\0';
line->string[5] = tp->inattr;
if (count > tp->view.cols * 2 - 11)
count = tp->view.cols * 2 - 11;
memcpy(line->string + 6, input, count);
line->string[6 + count] = TO_IC;
/* Clear to end of input line. */
if (count < tp->view.cols * 2 - 11) {
tty3270_add_ra(tp, line->string + count + 7, -9, -1, 0);
line->len = 11 + count;
} else
line->len = 7 + count;
tp->update_flags |= TTY_UPDATE_INPUT; tp->update_flags |= TTY_UPDATE_INPUT;
tty3270_set_timer(tp, 1);
} }
static void tty3270_create_prompt(struct tty3270 *tp) /*
* The input line are the two last lines of the screen.
*/
static int tty3270_add_prompt(struct tty3270 *tp)
{ {
static const unsigned char blueprint[] = int count = 0;
{ TO_SBA, 0, 0, 0x6e, TO_SF, TF_INPUT, char *cp;
/* empty input string */
TO_IC, TO_RA, 0, 0, 0 };
struct string *line;
line = alloc_string(&tp->freemem,
sizeof(blueprint) + tp->view.cols * 2 - 9);
tp->prompt = line;
tp->inattr = TF_INPUT;
/* Copy blueprint to status line */
memcpy(line->string, blueprint, sizeof(blueprint));
line->len = sizeof(blueprint);
/* Set output offsets. */
raw3270_buffer_address(tp->view.dev, line->string + 1, 0, -2); cp = tp->converted_line;
raw3270_buffer_address(tp->view.dev, line->string + 8, -9, -1); cp = tty3270_add_ba(tp, cp, TO_SBA, 0, -2);
*cp++ = tp->view.ascebc['>'];
/* Allocate input string for reading. */ if (*tp->prompt) {
tp->input = alloc_string(&tp->freemem, tp->view.cols * 2 - 9 + 6); cp = tty3270_add_sf(tp, cp, TF_INMDT);
count = min_t(int, strlen(tp->prompt), tp->view.cols * 2 - 11);
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, -9, -1, 0);
return cp - tp->converted_line;
} }
/* /*
...@@ -513,10 +504,11 @@ static void tty3270_update(struct timer_list *t) ...@@ -513,10 +504,11 @@ static void tty3270_update(struct timer_list *t)
/* /*
* Write input line. * Write input line.
*/ */
if (tp->update_flags & TTY_UPDATE_INPUT) if (tp->update_flags & TTY_UPDATE_INPUT) {
if (raw3270_request_add_data(wrq, tp->prompt->string, len = tty3270_add_prompt(tp);
tp->prompt->len) == 0) if (raw3270_request_add_data(wrq, tp->converted_line, len) == 0)
updated |= TTY_UPDATE_INPUT; updated |= TTY_UPDATE_INPUT;
}
for (i = 0; i < tty3270_tty_rows(tp); i++) { for (i = 0; i < tty3270_tty_rows(tp); i++) {
line = tty3270_get_view_line(tp, i); line = tty3270_get_view_line(tp, i);
...@@ -662,11 +654,11 @@ static void tty3270_read_tasklet(unsigned long data) ...@@ -662,11 +654,11 @@ static void tty3270_read_tasklet(unsigned long data)
*/ */
input = NULL; input = NULL;
len = 0; len = 0;
switch (tp->input->string[0]) { switch (tp->input[0]) {
case AID_ENTER: case AID_ENTER:
/* Enter: write input to tty. */ /* Enter: write input to tty. */
input = tp->input->string + 6; input = tp->input + 6;
len = tp->input->len - 6 - rrq->rescnt; len = tty3270_input_size(tp->view.cols) - 6 - rrq->rescnt;
if (tp->inattr != TF_INPUTN) if (tp->inattr != TF_INPUTN)
tty3270_rcl_add(tp, input, len); tty3270_rcl_add(tp, input, len);
if (tp->nr_up > 0) if (tp->nr_up > 0)
...@@ -685,7 +677,7 @@ static void tty3270_read_tasklet(unsigned long data) ...@@ -685,7 +677,7 @@ static void tty3270_read_tasklet(unsigned long data)
(char *)sfq_read_partition, sizeof(sfq_read_partition)); (char *)sfq_read_partition, sizeof(sfq_read_partition));
break; break;
case AID_READ_PARTITION: case AID_READ_PARTITION:
raw3270_read_modified_cb(tp->readpartreq, tp->input->string); raw3270_read_modified_cb(tp->readpartreq, tp->input);
break; break;
default: default:
break; break;
...@@ -698,7 +690,7 @@ static void tty3270_read_tasklet(unsigned long data) ...@@ -698,7 +690,7 @@ static void tty3270_read_tasklet(unsigned long data)
while (len-- > 0) while (len-- > 0)
kbd_keycode(tp->kbd, *input++); kbd_keycode(tp->kbd, *input++);
/* Emit keycode for AID byte. */ /* Emit keycode for AID byte. */
kbd_keycode(tp->kbd, 256 + tp->input->string[0]); kbd_keycode(tp->kbd, 256 + tp->input[0]);
raw3270_request_reset(rrq); raw3270_request_reset(rrq);
xchg(&tp->read, rrq); xchg(&tp->read, rrq);
...@@ -731,7 +723,7 @@ static void tty3270_issue_read(struct tty3270 *tp, int lock) ...@@ -731,7 +723,7 @@ static void tty3270_issue_read(struct tty3270 *tp, int lock)
rrq->callback = tty3270_read_callback; rrq->callback = tty3270_read_callback;
rrq->callback_data = tp; rrq->callback_data = tp;
raw3270_request_set_cmd(rrq, TC_READMOD); raw3270_request_set_cmd(rrq, TC_READMOD);
raw3270_request_set_data(rrq, tp->input->string, tp->input->len); raw3270_request_set_data(rrq, tp->input, tty3270_input_size(tp->view.cols));
/* Issue the read modified request. */ /* Issue the read modified request. */
if (lock) { if (lock) {
rc = raw3270_start(&tp->view, rrq); rc = raw3270_start(&tp->view, rrq);
...@@ -938,6 +930,8 @@ static void tty3270_resize(struct raw3270_view *view, ...@@ -938,6 +930,8 @@ static void tty3270_resize(struct raw3270_view *view,
{ {
struct tty3270 *tp = container_of(view, struct tty3270, view); struct tty3270 *tp = container_of(view, struct tty3270, view);
struct tty3270_line *screen, *oscreen; struct tty3270_line *screen, *oscreen;
char *old_prompt, *new_prompt;
char *old_input, *new_input;
struct tty_struct *tty; struct tty_struct *tty;
struct winsize ws; struct winsize ws;
int new_allocated, old_allocated = tp->allocated_lines; int new_allocated, old_allocated = tp->allocated_lines;
...@@ -950,9 +944,17 @@ static void tty3270_resize(struct raw3270_view *view, ...@@ -950,9 +944,17 @@ static void tty3270_resize(struct raw3270_view *view,
spin_unlock_irq(&tp->view.lock); spin_unlock_irq(&tp->view.lock);
return; 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); screen = tty3270_alloc_screen(tp, new_rows, new_cols, &new_allocated);
if (IS_ERR(screen)) if (IS_ERR(screen))
return; goto out_prompt;
/* Switch to new output size */ /* Switch to new output size */
spin_lock_irq(&tp->view.lock); spin_lock_irq(&tp->view.lock);
tty3270_blank_screen(tp); tty3270_blank_screen(tp);
...@@ -962,12 +964,15 @@ static void tty3270_resize(struct raw3270_view *view, ...@@ -962,12 +964,15 @@ static void tty3270_resize(struct raw3270_view *view,
tp->view.rows = new_rows; tp->view.rows = new_rows;
tp->view.cols = new_cols; tp->view.cols = new_cols;
tp->view.model = new_model; tp->view.model = new_model;
free_string(&tp->freemem, tp->prompt);
tty3270_create_prompt(tp);
tp->update_flags = TTY_UPDATE_ALL; tp->update_flags = TTY_UPDATE_ALL;
old_input = tp->input;
old_prompt = tp->prompt;
tp->input = new_input;
tp->prompt = new_prompt;
spin_unlock_irq(&tp->view.lock); spin_unlock_irq(&tp->view.lock);
tty3270_free_screen(oscreen, old_allocated); tty3270_free_screen(oscreen, old_allocated);
kfree(old_input);
kfree(old_prompt);
tty3270_set_timer(tp, 1); tty3270_set_timer(tp, 1);
/* Informat tty layer about new size */ /* Informat tty layer about new size */
tty = tty_port_tty_get(&tp->port); tty = tty_port_tty_get(&tp->port);
...@@ -977,6 +982,11 @@ static void tty3270_resize(struct raw3270_view *view, ...@@ -977,6 +982,11 @@ static void tty3270_resize(struct raw3270_view *view,
ws.ws_col = tp->view.cols; ws.ws_col = tp->view.cols;
tty_do_resize(tty, &ws); tty_do_resize(tty, &ws);
tty_kref_put(tty); tty_kref_put(tty);
return;
out_prompt:
kfree(new_prompt);
out_input:
kfree(new_input);
} }
/* /*
...@@ -1006,6 +1016,8 @@ static void tty3270_free(struct raw3270_view *view) ...@@ -1006,6 +1016,8 @@ static void tty3270_free(struct raw3270_view *view)
del_timer_sync(&tp->timer); del_timer_sync(&tp->timer);
tty3270_free_screen(tp->screen, tp->allocated_lines); tty3270_free_screen(tp->screen, tp->allocated_lines);
free_page((unsigned long)tp->converted_line); free_page((unsigned long)tp->converted_line);
kfree(tp->input);
kfree(tp->prompt);
tty3270_free_view(tp); tty3270_free_view(tp);
} }
...@@ -1065,7 +1077,17 @@ tty3270_create_view(int index, struct tty3270 **newtp) ...@@ -1065,7 +1077,17 @@ tty3270_create_view(int index, struct tty3270 **newtp)
goto out_free_screen; goto out_free_screen;
} }
tty3270_create_prompt(tp); 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;
}
/* Create blank line for every line in the tty output area. */ /* Create blank line for every line in the tty output area. */
tty3270_blank_screen(tp); tty3270_blank_screen(tp);
...@@ -1082,6 +1104,10 @@ tty3270_create_view(int index, struct tty3270 **newtp) ...@@ -1082,6 +1104,10 @@ tty3270_create_view(int index, struct tty3270 **newtp)
*newtp = tp; *newtp = tp;
return 0; return 0;
out_free_input:
kfree(tp->input);
out_free_converted_line:
free_page((unsigned long)tp->converted_line);
out_free_screen: out_free_screen:
tty3270_free_screen(tp->screen, tp->view.rows); tty3270_free_screen(tp->screen, tp->view.rows);
out_put_view: out_put_view:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment