brintos

brintos / linux-shallow public Read only

0
0
Text · 1.2 KiB · 9112d46 Raw
48 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Generic Reed Solomon encoder / decoder library4 *5 * Copyright 2002, Phil Karn, KA9Q6 * May be used under the terms of the GNU General Public License (GPL)7 *8 * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de)9 *10 * Generic data width independent code which is included by the wrappers.11 */12{13	struct rs_codec *rs = rsc->codec;14	int i, j, pad;15	int nn = rs->nn;16	int nroots = rs->nroots;17	uint16_t *alpha_to = rs->alpha_to;18	uint16_t *index_of = rs->index_of;19	uint16_t *genpoly = rs->genpoly;20	uint16_t fb;21	uint16_t msk = (uint16_t) rs->nn;22 23	/* Check length parameter for validity */24	pad = nn - nroots - len;25	if (pad < 0 || pad >= nn)26		return -ERANGE;27 28	for (i = 0; i < len; i++) {29		fb = index_of[((((uint16_t) data[i])^invmsk) & msk) ^ par[0]];30		/* feedback term is non-zero */31		if (fb != nn) {32			for (j = 1; j < nroots; j++) {33				par[j] ^= alpha_to[rs_modnn(rs, fb +34							 genpoly[nroots - j])];35			}36		}37		/* Shift */38		memmove(&par[0], &par[1], sizeof(uint16_t) * (nroots - 1));39		if (fb != nn) {40			par[nroots - 1] = alpha_to[rs_modnn(rs,41							    fb + genpoly[0])];42		} else {43			par[nroots - 1] = 0;44		}45	}46	return 0;47}48