From f77f936afe1ea9342725bff0bd0f7aaa54699794 Mon Sep 17 00:00:00 2001 From: Sven Schnelle Date: Sat, 26 Nov 2022 20:18:21 +0100 Subject: s390/raw3270: make raw3270_buffer_address() accept x/y coordinates All callers of raw3270_buffer_address() are calculating the offset from some x/y coordinates. Move that calculation inside of the function, so user can pass the x/y values directly. Note that negative values are relative to the end-of-line or end-of-screen. Signed-off-by: Sven Schnelle Acked-by: Heiko Carstens Tested-by: Niklas Schnelle Signed-off-by: Heiko Carstens --- drivers/s390/char/con3270.c | 21 ++++++++------------- drivers/s390/char/raw3270.c | 9 ++++++++- drivers/s390/char/raw3270.h | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) (limited to 'drivers/s390/char') diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c index d3c9fb27a03f..0a4fce0b557d 100644 --- a/drivers/s390/char/con3270.c +++ b/drivers/s390/char/con3270.c @@ -133,6 +133,7 @@ struct tty3270 { #define TTY_UPDATE_ALL 16 /* Recreate screen. */ #define TTY3270_INPUT_AREA_ROWS 2 + static void tty3270_update(struct timer_list *); /* * Setup timeout for a device. On timeout trigger an update. @@ -153,7 +154,6 @@ static int tty3270_tty_rows(struct tty3270 *tp) static void tty3270_update_prompt(struct tty3270 *tp, char *input, int count) { struct string *line; - unsigned int off; line = tp->prompt; if (count != 0) @@ -168,8 +168,7 @@ static void tty3270_update_prompt(struct tty3270 *tp, char *input, int count) if (count < tp->view.cols * 2 - 11) { line->string[7 + count] = TO_RA; line->string[10 + count] = 0; - off = tp->view.cols * tp->view.rows - 9; - raw3270_buffer_address(tp->view.dev, line->string+count+8, off); + raw3270_buffer_address(tp->view.dev, line->string+count+8, -9, -1); line->len = 11 + count; } else line->len = 7 + count; @@ -183,7 +182,6 @@ static void tty3270_create_prompt(struct tty3270 *tp) /* empty input string */ TO_IC, TO_RA, 0, 0, 0 }; struct string *line; - unsigned int offset; line = alloc_string(&tp->freemem, sizeof(blueprint) + tp->view.cols * 2 - 9); @@ -193,10 +191,9 @@ static void tty3270_create_prompt(struct tty3270 *tp) memcpy(line->string, blueprint, sizeof(blueprint)); line->len = sizeof(blueprint); /* Set output offsets. */ - offset = tp->view.cols * tty3270_tty_rows(tp); - raw3270_buffer_address(tp->view.dev, line->string + 1, offset); - offset = tp->view.cols * tp->view.rows - 9; - raw3270_buffer_address(tp->view.dev, line->string + 8, offset); + + raw3270_buffer_address(tp->view.dev, line->string + 1, 0, -2); + raw3270_buffer_address(tp->view.dev, line->string + 8, -9, -1); /* Allocate input string for reading. */ tp->input = alloc_string(&tp->freemem, tp->view.cols * 2 - 9 + 6); @@ -232,7 +229,7 @@ static void tty3270_create_status(struct tty3270 *tp) memcpy(line->string, blueprint, sizeof(blueprint)); /* Set address to start of status string (= last 9 characters). */ offset = tp->view.cols * tp->view.rows - 9; - raw3270_buffer_address(tp->view.dev, line->string + 1, offset); + raw3270_buffer_address(tp->view.dev, line->string + 1, -9, -1); } /* @@ -243,12 +240,10 @@ static void tty3270_update_string(struct tty3270 *tp, struct string *line, int n { unsigned char *cp; - raw3270_buffer_address(tp->view.dev, line->string + 1, - tp->view.cols * nr); + raw3270_buffer_address(tp->view.dev, line->string + 1, 0, nr); cp = line->string + line->len - 4; if (*cp == TO_RA) - raw3270_buffer_address(tp->view.dev, cp + 1, - tp->view.cols * (nr + 1)); + raw3270_buffer_address(tp->view.dev, cp + 1, 0, nr + 1); } /* diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index e2d703e8ad48..6f55a094ad3e 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c @@ -113,8 +113,15 @@ static inline int raw3270_state_ready(struct raw3270 *rp) return rp->state == RAW3270_STATE_READY; } -void raw3270_buffer_address(struct raw3270 *rp, char *cp, unsigned short addr) +void raw3270_buffer_address(struct raw3270 *rp, char *cp, int x, int y) { + int addr; + + if (x < 0) + x = max_t(int, 0, rp->view->cols + x); + if (y < 0) + y = max_t(int, 0, rp->view->rows + y); + addr = (y * rp->view->cols) + x; if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) { cp[0] = (addr >> 8) & 0x3f; cp[1] = addr & 0xff; diff --git a/drivers/s390/char/raw3270.h b/drivers/s390/char/raw3270.h index 05cd501478ee..23efa6b8be49 100644 --- a/drivers/s390/char/raw3270.h +++ b/drivers/s390/char/raw3270.h @@ -132,7 +132,7 @@ raw3270_request_final(struct raw3270_request *rq) return list_empty(&rq->list); } -void raw3270_buffer_address(struct raw3270 *, char *, unsigned short); +void raw3270_buffer_address(struct raw3270 *, char *, int, int); /* * Functions of a 3270 view. -- cgit v1.2.3