diff options
Diffstat (limited to 'lib/reed_solomon/encode_rs.c')
-rw-r--r-- | lib/reed_solomon/encode_rs.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/reed_solomon/encode_rs.c b/lib/reed_solomon/encode_rs.c new file mode 100644 index 000000000000..237bf65ae886 --- /dev/null +++ b/lib/reed_solomon/encode_rs.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * lib/reed_solomon/encode_rs.c | ||
3 | * | ||
4 | * Overview: | ||
5 | * Generic Reed Solomon encoder / decoder library | ||
6 | * | ||
7 | * Copyright 2002, Phil Karn, KA9Q | ||
8 | * May be used under the terms of the GNU General Public License (GPL) | ||
9 | * | ||
10 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) | ||
11 | * | ||
12 | * $Id: encode_rs.c,v 1.4 2004/10/22 15:41:47 gleixner Exp $ | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | /* Generic data width independent code which is included by the | ||
17 | * wrappers. | ||
18 | * int encode_rsX (struct rs_control *rs, uintX_t *data, int len, uintY_t *par) | ||
19 | */ | ||
20 | { | ||
21 | int i, j, pad; | ||
22 | int nn = rs->nn; | ||
23 | int nroots = rs->nroots; | ||
24 | uint16_t *alpha_to = rs->alpha_to; | ||
25 | uint16_t *index_of = rs->index_of; | ||
26 | uint16_t *genpoly = rs->genpoly; | ||
27 | uint16_t fb; | ||
28 | uint16_t msk = (uint16_t) rs->nn; | ||
29 | |||
30 | /* Check length parameter for validity */ | ||
31 | pad = nn - nroots - len; | ||
32 | if (pad < 0 || pad >= nn) | ||
33 | return -ERANGE; | ||
34 | |||
35 | for (i = 0; i < len; i++) { | ||
36 | fb = index_of[((((uint16_t) data[i])^invmsk) & msk) ^ par[0]]; | ||
37 | /* feedback term is non-zero */ | ||
38 | if (fb != nn) { | ||
39 | for (j = 1; j < nroots; j++) { | ||
40 | par[j] ^= alpha_to[rs_modnn(rs, fb + | ||
41 | genpoly[nroots - j])]; | ||
42 | } | ||
43 | } | ||
44 | /* Shift */ | ||
45 | memmove(&par[0], &par[1], sizeof(uint16_t) * (nroots - 1)); | ||
46 | if (fb != nn) { | ||
47 | par[nroots - 1] = alpha_to[rs_modnn(rs, | ||
48 | fb + genpoly[0])]; | ||
49 | } else { | ||
50 | par[nroots - 1] = 0; | ||
51 | } | ||
52 | } | ||
53 | return 0; | ||
54 | } | ||