root/lib/reed_solomon/encode_rs.c

/* [<][>][^][v][top][bottom][index][help] */
   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Generic Reed Solomon encoder / decoder library
   4  *
   5  * Copyright 2002, Phil Karn, KA9Q
   6  * 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 }

/* [<][>][^][v][top][bottom][index][help] */