encode_rs.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. /* Check length parameter for validity */
  23. pad = nn - nroots - len;
  24. if (pad < 0 || pad >= nn)
  25. return -ERANGE;
  26. for (i = 0; i < len; i++) {
  27. fb = index_of[((((uint16_t) data[i])^invmsk) & msk) ^ par[0]];
  28. /* feedback term is non-zero */
  29. if (fb != nn) {
  30. for (j = 1; j < nroots; j++) {
  31. par[j] ^= alpha_to[rs_modnn(rs, fb +
  32. genpoly[nroots - j])];
  33. }
  34. }
  35. /* Shift */
  36. memmove(&par[0], &par[1], sizeof(uint16_t) * (nroots - 1));
  37. if (fb != nn) {
  38. par[nroots - 1] = alpha_to[rs_modnn(rs,
  39. fb + genpoly[0])];
  40. } else {
  41. par[nroots - 1] = 0;
  42. }
  43. }
  44. return 0;
  45. }