From: Milton Miller Separate the NUL character filtering from get_hvc_chars. Signed-off-by: Milton Miller Signed-off-by: Anton Blanchard Signed-off-by: Andrew Morton --- arch/ppc64/kernel/hvconsole.c | 19 ++----------------- drivers/char/hvc_vio.c | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 18 deletions(-) diff -puN arch/ppc64/kernel/hvconsole.c~hvc_console-separate-the-nul-character-filtering-from-get_hvc_chars arch/ppc64/kernel/hvconsole.c --- 25/arch/ppc64/kernel/hvconsole.c~hvc_console-separate-the-nul-character-filtering-from-get_hvc_chars Wed Jul 6 14:00:43 2005 +++ 25-akpm/arch/ppc64/kernel/hvconsole.c Wed Jul 6 14:00:43 2005 @@ -41,29 +41,14 @@ int hvc_get_chars(uint32_t vtermno, char unsigned long got; if (plpar_hcall(H_GET_TERM_CHAR, vtermno, 0, 0, 0, &got, - (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) { - /* - * Work around a HV bug where it gives us a null - * after every \r. -- paulus - */ - if (got > 0) { - int i; - for (i = 1; i < got; ++i) { - if (buf[i] == 0 && buf[i-1] == '\r') { - --got; - if (i < got) - memmove(&buf[i], &buf[i+1], - got - i); - } - } - } + (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) return got; - } return 0; } EXPORT_SYMBOL(hvc_get_chars); + /** * hvc_put_chars: send characters to firmware for denoted vterm adapter * @vtermno: The vtermno or unit_address of the adapter from which the data diff -puN drivers/char/hvc_vio.c~hvc_console-separate-the-nul-character-filtering-from-get_hvc_chars drivers/char/hvc_vio.c --- 25/drivers/char/hvc_vio.c~hvc_console-separate-the-nul-character-filtering-from-get_hvc_chars Wed Jul 6 14:00:43 2005 +++ 25-akpm/drivers/char/hvc_vio.c Wed Jul 6 14:00:43 2005 @@ -43,8 +43,30 @@ static struct vio_device_id hvc_driver_t }; MODULE_DEVICE_TABLE(vio, hvc_driver_table); +static int filtered_get_chars(uint32_t vtermno, char *buf, int count) +{ + unsigned long got; + int i; + + got = hvc_get_chars(vtermno, buf, count); + + /* + * Work around a HV bug where it gives us a null + * after every \r. -- paulus + */ + for (i = 1; i < got; ++i) { + if (buf[i] == 0 && buf[i-1] == '\r') { + --got; + if (i < got) + memmove(&buf[i], &buf[i+1], + got - i); + } + } + return got; +} + static struct hv_ops hvc_get_put_ops = { - .get_chars = hvc_get_chars, + .get_chars = filtered_get_chars, .put_chars = hvc_put_chars, }; _