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 | } | ||
