linux/lib/reed_solomon/encode_rs.c
<<
>>
Prefs
   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}
  48