162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Generic Reed Solomon encoder / decoder library 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2002, Phil Karn, KA9Q 662306a36Sopenharmony_ci * May be used under the terms of the GNU General Public License (GPL) 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Generic data width independent code which is included by the wrappers. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci struct rs_codec *rs = rsc->codec; 1462306a36Sopenharmony_ci int i, j, pad; 1562306a36Sopenharmony_ci int nn = rs->nn; 1662306a36Sopenharmony_ci int nroots = rs->nroots; 1762306a36Sopenharmony_ci uint16_t *alpha_to = rs->alpha_to; 1862306a36Sopenharmony_ci uint16_t *index_of = rs->index_of; 1962306a36Sopenharmony_ci uint16_t *genpoly = rs->genpoly; 2062306a36Sopenharmony_ci uint16_t fb; 2162306a36Sopenharmony_ci uint16_t msk = (uint16_t) rs->nn; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci /* Check length parameter for validity */ 2462306a36Sopenharmony_ci pad = nn - nroots - len; 2562306a36Sopenharmony_ci if (pad < 0 || pad >= nn) 2662306a36Sopenharmony_ci return -ERANGE; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci for (i = 0; i < len; i++) { 2962306a36Sopenharmony_ci fb = index_of[((((uint16_t) data[i])^invmsk) & msk) ^ par[0]]; 3062306a36Sopenharmony_ci /* feedback term is non-zero */ 3162306a36Sopenharmony_ci if (fb != nn) { 3262306a36Sopenharmony_ci for (j = 1; j < nroots; j++) { 3362306a36Sopenharmony_ci par[j] ^= alpha_to[rs_modnn(rs, fb + 3462306a36Sopenharmony_ci genpoly[nroots - j])]; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci /* Shift */ 3862306a36Sopenharmony_ci memmove(&par[0], &par[1], sizeof(uint16_t) * (nroots - 1)); 3962306a36Sopenharmony_ci if (fb != nn) { 4062306a36Sopenharmony_ci par[nroots - 1] = alpha_to[rs_modnn(rs, 4162306a36Sopenharmony_ci fb + genpoly[0])]; 4262306a36Sopenharmony_ci } else { 4362306a36Sopenharmony_ci par[nroots - 1] = 0; 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci return 0; 4762306a36Sopenharmony_ci} 48