0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _RSLIB_H_
0011 #define _RSLIB_H_
0012
0013 #include <linux/list.h>
0014 #include <linux/types.h> /* for gfp_t */
0015 #include <linux/gfp.h> /* for GFP_KERNEL */
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 struct rs_codec {
0035 int mm;
0036 int nn;
0037 uint16_t *alpha_to;
0038 uint16_t *index_of;
0039 uint16_t *genpoly;
0040 int nroots;
0041 int fcr;
0042 int prim;
0043 int iprim;
0044 int gfpoly;
0045 int (*gffunc)(int);
0046 int users;
0047 struct list_head list;
0048 };
0049
0050
0051
0052
0053
0054
0055 struct rs_control {
0056 struct rs_codec *codec;
0057 uint16_t buffers[];
0058 };
0059
0060
0061 #ifdef CONFIG_REED_SOLOMON_ENC8
0062 int encode_rs8(struct rs_control *rs, uint8_t *data, int len, uint16_t *par,
0063 uint16_t invmsk);
0064 #endif
0065 #ifdef CONFIG_REED_SOLOMON_DEC8
0066 int decode_rs8(struct rs_control *rs, uint8_t *data, uint16_t *par, int len,
0067 uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk,
0068 uint16_t *corr);
0069 #endif
0070
0071
0072 #ifdef CONFIG_REED_SOLOMON_ENC16
0073 int encode_rs16(struct rs_control *rs, uint16_t *data, int len, uint16_t *par,
0074 uint16_t invmsk);
0075 #endif
0076 #ifdef CONFIG_REED_SOLOMON_DEC16
0077 int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len,
0078 uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk,
0079 uint16_t *corr);
0080 #endif
0081
0082 struct rs_control *init_rs_gfp(int symsize, int gfpoly, int fcr, int prim,
0083 int nroots, gfp_t gfp);
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098 static inline struct rs_control *init_rs(int symsize, int gfpoly, int fcr,
0099 int prim, int nroots)
0100 {
0101 return init_rs_gfp(symsize, gfpoly, fcr, prim, nroots, GFP_KERNEL);
0102 }
0103
0104 struct rs_control *init_rs_non_canonical(int symsize, int (*func)(int),
0105 int fcr, int prim, int nroots);
0106
0107
0108 void free_rs(struct rs_control *rs);
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122 static inline int rs_modnn(struct rs_codec *rs, int x)
0123 {
0124 while (x >= rs->nn) {
0125 x -= rs->nn;
0126 x = (x >> rs->mm) + (x & rs->nn);
0127 }
0128 return x;
0129 }
0130
0131 #endif