18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Generic Reed Solomon encoder / decoder library 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2002, Phil Karn, KA9Q 68c2ecf20Sopenharmony_ci * May be used under the terms of the GNU General Public License (GPL) 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * Generic data width independent code which is included by the wrappers. 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci struct rs_codec *rs = rsc->codec; 148c2ecf20Sopenharmony_ci int i, j, pad; 158c2ecf20Sopenharmony_ci int nn = rs->nn; 168c2ecf20Sopenharmony_ci int nroots = rs->nroots; 178c2ecf20Sopenharmony_ci uint16_t *alpha_to = rs->alpha_to; 188c2ecf20Sopenharmony_ci uint16_t *index_of = rs->index_of; 198c2ecf20Sopenharmony_ci uint16_t *genpoly = rs->genpoly; 208c2ecf20Sopenharmony_ci uint16_t fb; 218c2ecf20Sopenharmony_ci uint16_t msk = (uint16_t) rs->nn; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci /* Check length parameter for validity */ 248c2ecf20Sopenharmony_ci pad = nn - nroots - len; 258c2ecf20Sopenharmony_ci if (pad < 0 || pad >= nn) 268c2ecf20Sopenharmony_ci return -ERANGE; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci for (i = 0; i < len; i++) { 298c2ecf20Sopenharmony_ci fb = index_of[((((uint16_t) data[i])^invmsk) & msk) ^ par[0]]; 308c2ecf20Sopenharmony_ci /* feedback term is non-zero */ 318c2ecf20Sopenharmony_ci if (fb != nn) { 328c2ecf20Sopenharmony_ci for (j = 1; j < nroots; j++) { 338c2ecf20Sopenharmony_ci par[j] ^= alpha_to[rs_modnn(rs, fb + 348c2ecf20Sopenharmony_ci genpoly[nroots - j])]; 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci } 378c2ecf20Sopenharmony_ci /* Shift */ 388c2ecf20Sopenharmony_ci memmove(&par[0], &par[1], sizeof(uint16_t) * (nroots - 1)); 398c2ecf20Sopenharmony_ci if (fb != nn) { 408c2ecf20Sopenharmony_ci par[nroots - 1] = alpha_to[rs_modnn(rs, 418c2ecf20Sopenharmony_ci fb + genpoly[0])]; 428c2ecf20Sopenharmony_ci } else { 438c2ecf20Sopenharmony_ci par[nroots - 1] = 0; 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci } 468c2ecf20Sopenharmony_ci return 0; 478c2ecf20Sopenharmony_ci} 48