diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2015-07-24 22:29:52 +0200 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2015-08-03 00:31:51 +0200 |
commit | 14b63a4bee081a5e9e54589db3872c922fcba39c (patch) | |
tree | 7f56a93aa2bf6805ba3b6bb0eb11699faad9e986 /backport/compat/backport-4.3.c | |
parent | 8b30ab914b5b783cfd1e8912afd66bb67ccb3c4f (diff) |
backports: add seq_hex_dump()
seq_hex_dump() is needed by the wil6210 driver and was added in this
commit:
commit 96e6df4cfc6ecf91097eb8eec55983a5f102a477
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date: Fri Jul 24 09:11:53 2015 +1000
seq_file: provide an analogue of print_hex_dump()
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'backport/compat/backport-4.3.c')
-rw-r--r-- | backport/compat/backport-4.3.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/backport/compat/backport-4.3.c b/backport/compat/backport-4.3.c new file mode 100644 index 00000000..d15c92c9 --- /dev/null +++ b/backport/compat/backport-4.3.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 Hauke Mehrtens <hauke@hauke-m.de> + * + * Backport functionality introduced in Linux 4.3. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/seq_file.h> +#include <linux/export.h> +#include <linux/printk.h> + +static void seq_set_overflow(struct seq_file *m) +{ + m->count = m->size; +} + +/* A complete analogue of print_hex_dump() */ +void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type, + int rowsize, int groupsize, const void *buf, size_t len, + bool ascii) +{ + const u8 *ptr = buf; + int i, linelen, remaining = len; + int ret; + + if (rowsize != 16 && rowsize != 32) + rowsize = 16; + + for (i = 0; i < len && !seq_has_overflowed(m); i += rowsize) { + linelen = min(remaining, rowsize); + remaining -= rowsize; + + switch (prefix_type) { + case DUMP_PREFIX_ADDRESS: + seq_printf(m, "%s%p: ", prefix_str, ptr + i); + break; + case DUMP_PREFIX_OFFSET: + seq_printf(m, "%s%.8x: ", prefix_str, i); + break; + default: + seq_printf(m, "%s", prefix_str); + break; + } + + ret = hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, + m->buf + m->count, m->size - m->count, + ascii); + if (ret >= m->size - m->count) { + seq_set_overflow(m); + } else { + m->count += ret; + seq_putc(m, '\n'); + } + } +} +EXPORT_SYMBOL_GPL(seq_hex_dump); |