Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
03ead842
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
03ead842
编写于
11月 07, 2005
作者:
T
Thomas Gleixner
提交者:
Thomas Gleixner
11月 07, 2005
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[LIB] reed_solomon: Clean up trailing white spaces
上级
182ec4ee
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
72 addition
and
72 deletion
+72
-72
include/linux/rslib.h
include/linux/rslib.h
+14
-14
lib/reed_solomon/Makefile
lib/reed_solomon/Makefile
+1
-1
lib/reed_solomon/decode_rs.c
lib/reed_solomon/decode_rs.c
+18
-18
lib/reed_solomon/encode_rs.c
lib/reed_solomon/encode_rs.c
+7
-7
lib/reed_solomon/reed_solomon.c
lib/reed_solomon/reed_solomon.c
+32
-32
未找到文件。
include/linux/rslib.h
浏览文件 @
03ead842
/*
/*
* include/linux/rslib.h
*
* Overview:
* Generic Reed Solomon encoder / decoder library
*
*
* Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de)
*
* RS code lifted from reed solomon library written by Phil Karn
* Copyright 2002 Phil Karn, KA9Q
*
* $Id: rslib.h,v 1.
3 2004/10/05 22:08:2
2 gleixner Exp $
* $Id: rslib.h,v 1.
4 2005/11/07 11:14:5
2 gleixner Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
...
...
@@ -21,20 +21,20 @@
#include <linux/list.h>
/**
/**
* struct rs_control - rs control structure
*
*
* @mm: Bits per symbol
* @nn: Symbols per block (= (1<<mm)-1)
* @alpha_to: log lookup table
* @index_of: Antilog lookup table
* @genpoly: Generator polynomial
* @genpoly: Generator polynomial
* @nroots: Number of generator roots = number of parity symbols
* @fcr: First consecutive root, index form
* @prim: Primitive element, index form
* @iprim: prim-th root of 1, index form
* @gfpoly: The primitive generator polynominal
* @users: Users of this structure
* @prim: Primitive element, index form
* @iprim: prim-th root of 1, index form
* @gfpoly: The primitive generator polynominal
* @users: Users of this structure
* @list: List entry for the rs control list
*/
struct
rs_control
{
...
...
@@ -58,7 +58,7 @@ int encode_rs8(struct rs_control *rs, uint8_t *data, int len, uint16_t *par,
uint16_t
invmsk
);
#endif
#ifdef CONFIG_REED_SOLOMON_DEC8
int
decode_rs8
(
struct
rs_control
*
rs
,
uint8_t
*
data
,
uint16_t
*
par
,
int
len
,
int
decode_rs8
(
struct
rs_control
*
rs
,
uint8_t
*
data
,
uint16_t
*
par
,
int
len
,
uint16_t
*
s
,
int
no_eras
,
int
*
eras_pos
,
uint16_t
invmsk
,
uint16_t
*
corr
);
#endif
...
...
@@ -75,7 +75,7 @@ int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len,
#endif
/* Create or get a matching rs control structure */
struct
rs_control
*
init_rs
(
int
symsize
,
int
gfpoly
,
int
fcr
,
int
prim
,
struct
rs_control
*
init_rs
(
int
symsize
,
int
gfpoly
,
int
fcr
,
int
prim
,
int
nroots
);
/* Release a rs control structure */
...
...
@@ -87,9 +87,9 @@ void free_rs(struct rs_control *rs);
* @x: the value to reduce
*
* where
* rs->mm = number of bits per symbol
* rs->mm = number of bits per symbol
* rs->nn = (2^rs->mm) - 1
*
*
* Simple arithmetic modulo would return a wrong result for values
* >= 3 * rs->nn
*/
...
...
lib/reed_solomon/Makefile
浏览文件 @
03ead842
#
# This is a modified version of reed solomon lib,
# This is a modified version of reed solomon lib,
#
obj-$(CONFIG_REED_SOLOMON)
+=
reed_solomon.o
...
...
lib/reed_solomon/decode_rs.c
浏览文件 @
03ead842
/*
/*
* lib/reed_solomon/decode_rs.c
*
* Overview:
* Generic Reed Solomon encoder / decoder library
*
*
* Copyright 2002, Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*
* Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de)
*
* $Id: decode_rs.c,v 1.
6 2004/10/22 15:41:47
gleixner Exp $
* $Id: decode_rs.c,v 1.
7 2005/11/07 11:14:59
gleixner Exp $
*
*/
/* Generic data width independent code which is included by the
/* Generic data width independent code which is included by the
* wrappers.
*/
{
{
int
deg_lambda
,
el
,
deg_omega
;
int
i
,
j
,
r
,
k
,
pad
;
int
nn
=
rs
->
nn
;
...
...
@@ -41,9 +41,9 @@
pad
=
nn
-
nroots
-
len
;
if
(
pad
<
0
||
pad
>=
nn
)
return
-
ERANGE
;
/* Does the caller provide the syndrome ? */
if
(
s
!=
NULL
)
if
(
s
!=
NULL
)
goto
decode
;
/* form the syndromes; i.e., evaluate data(x) at roots of
...
...
@@ -54,11 +54,11 @@
for
(
j
=
1
;
j
<
len
;
j
++
)
{
for
(
i
=
0
;
i
<
nroots
;
i
++
)
{
if
(
syn
[
i
]
==
0
)
{
syn
[
i
]
=
(((
uint16_t
)
data
[
j
])
^
syn
[
i
]
=
(((
uint16_t
)
data
[
j
])
^
invmsk
)
&
msk
;
}
else
{
syn
[
i
]
=
((((
uint16_t
)
data
[
j
])
^
invmsk
)
&
msk
)
^
invmsk
)
&
msk
)
^
alpha_to
[
rs_modnn
(
rs
,
index_of
[
syn
[
i
]]
+
(
fcr
+
i
)
*
prim
)];
}
...
...
@@ -70,7 +70,7 @@
if
(
syn
[
i
]
==
0
)
{
syn
[
i
]
=
((
uint16_t
)
par
[
j
])
&
msk
;
}
else
{
syn
[
i
]
=
(((
uint16_t
)
par
[
j
])
&
msk
)
^
syn
[
i
]
=
(((
uint16_t
)
par
[
j
])
&
msk
)
^
alpha_to
[
rs_modnn
(
rs
,
index_of
[
syn
[
i
]]
+
(
fcr
+
i
)
*
prim
)];
}
...
...
@@ -99,14 +99,14 @@
if
(
no_eras
>
0
)
{
/* Init lambda to be the erasure locator polynomial */
lambda
[
1
]
=
alpha_to
[
rs_modnn
(
rs
,
lambda
[
1
]
=
alpha_to
[
rs_modnn
(
rs
,
prim
*
(
nn
-
1
-
eras_pos
[
0
]))];
for
(
i
=
1
;
i
<
no_eras
;
i
++
)
{
u
=
rs_modnn
(
rs
,
prim
*
(
nn
-
1
-
eras_pos
[
i
]));
for
(
j
=
i
+
1
;
j
>
0
;
j
--
)
{
tmp
=
index_of
[
lambda
[
j
-
1
]];
if
(
tmp
!=
nn
)
{
lambda
[
j
]
^=
lambda
[
j
]
^=
alpha_to
[
rs_modnn
(
rs
,
u
+
tmp
)];
}
}
...
...
@@ -127,8 +127,8 @@
discr_r
=
0
;
for
(
i
=
0
;
i
<
r
;
i
++
)
{
if
((
lambda
[
i
]
!=
0
)
&&
(
s
[
r
-
i
-
1
]
!=
nn
))
{
discr_r
^=
alpha_to
[
rs_modnn
(
rs
,
discr_r
^=
alpha_to
[
rs_modnn
(
rs
,
index_of
[
lambda
[
i
]]
+
s
[
r
-
i
-
1
])];
}
...
...
@@ -143,7 +143,7 @@
t
[
0
]
=
lambda
[
0
];
for
(
i
=
0
;
i
<
nroots
;
i
++
)
{
if
(
b
[
i
]
!=
nn
)
{
t
[
i
+
1
]
=
lambda
[
i
+
1
]
^
t
[
i
+
1
]
=
lambda
[
i
+
1
]
^
alpha_to
[
rs_modnn
(
rs
,
discr_r
+
b
[
i
])];
}
else
...
...
@@ -229,7 +229,7 @@
num1
=
0
;
for
(
i
=
deg_omega
;
i
>=
0
;
i
--
)
{
if
(
omega
[
i
]
!=
nn
)
num1
^=
alpha_to
[
rs_modnn
(
rs
,
omega
[
i
]
+
num1
^=
alpha_to
[
rs_modnn
(
rs
,
omega
[
i
]
+
i
*
root
[
j
])];
}
num2
=
alpha_to
[
rs_modnn
(
rs
,
root
[
j
]
*
(
fcr
-
1
)
+
nn
)];
...
...
@@ -239,13 +239,13 @@
* lambda_pr of lambda[i] */
for
(
i
=
min
(
deg_lambda
,
nroots
-
1
)
&
~
1
;
i
>=
0
;
i
-=
2
)
{
if
(
lambda
[
i
+
1
]
!=
nn
)
{
den
^=
alpha_to
[
rs_modnn
(
rs
,
lambda
[
i
+
1
]
+
den
^=
alpha_to
[
rs_modnn
(
rs
,
lambda
[
i
+
1
]
+
i
*
root
[
j
])];
}
}
/* Apply error to data */
if
(
num1
!=
0
&&
loc
[
j
]
>=
pad
)
{
uint16_t
cor
=
alpha_to
[
rs_modnn
(
rs
,
index_of
[
num1
]
+
uint16_t
cor
=
alpha_to
[
rs_modnn
(
rs
,
index_of
[
num1
]
+
index_of
[
num2
]
+
nn
-
index_of
[
den
])];
/* Store the error correction pattern, if a
...
...
lib/reed_solomon/encode_rs.c
浏览文件 @
03ead842
/*
/*
* lib/reed_solomon/encode_rs.c
*
* Overview:
* Generic Reed Solomon encoder / decoder library
*
*
* Copyright 2002, Phil Karn, KA9Q
* May be used under the terms of the GNU General Public License (GPL)
*
* Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de)
*
* $Id: encode_rs.c,v 1.
4 2004/10/22 15:41:47
gleixner Exp $
* $Id: encode_rs.c,v 1.
5 2005/11/07 11:14:59
gleixner Exp $
*
*/
/* Generic data width independent code which is included by the
/* Generic data width independent code which is included by the
* wrappers.
* int encode_rsX (struct rs_control *rs, uintX_t *data, int len, uintY_t *par)
*/
...
...
@@ -35,16 +35,16 @@
for
(
i
=
0
;
i
<
len
;
i
++
)
{
fb
=
index_of
[((((
uint16_t
)
data
[
i
])
^
invmsk
)
&
msk
)
^
par
[
0
]];
/* feedback term is non-zero */
if
(
fb
!=
nn
)
{
if
(
fb
!=
nn
)
{
for
(
j
=
1
;
j
<
nroots
;
j
++
)
{
par
[
j
]
^=
alpha_to
[
rs_modnn
(
rs
,
fb
+
par
[
j
]
^=
alpha_to
[
rs_modnn
(
rs
,
fb
+
genpoly
[
nroots
-
j
])];
}
}
/* Shift */
memmove
(
&
par
[
0
],
&
par
[
1
],
sizeof
(
uint16_t
)
*
(
nroots
-
1
));
if
(
fb
!=
nn
)
{
par
[
nroots
-
1
]
=
alpha_to
[
rs_modnn
(
rs
,
par
[
nroots
-
1
]
=
alpha_to
[
rs_modnn
(
rs
,
fb
+
genpoly
[
0
])];
}
else
{
par
[
nroots
-
1
]
=
0
;
...
...
lib/reed_solomon/reed_solomon.c
浏览文件 @
03ead842
/*
/*
* lib/reed_solomon/rslib.c
*
* Overview:
* Generic Reed Solomon encoder / decoder library
*
*
* Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de)
*
* Reed Solomon code lifted from reed solomon library written by Phil Karn
* Copyright 2002 Phil Karn, KA9Q
*
* $Id: rslib.c,v 1.
5 2004/10/22 15:41:47
gleixner Exp $
* $Id: rslib.c,v 1.
7 2005/11/07 11:14:59
gleixner Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Description:
*
*
* The generic Reed Solomon library provides runtime configurable
* encoding / decoding of RS codes.
* Each user must call init_rs to get a pointer to a rs_control
...
...
@@ -25,11 +25,11 @@
* If a structure is generated then the polynomial arrays for
* fast encoding / decoding are built. This can take some time so
* make sure not to call this function from a time critical path.
* Usually a module / driver should initialize the necessary
* Usually a module / driver should initialize the necessary
* rs_control structure on module / driver init and release it
* on exit.
* The encoding puts the calculated syndrome into a given syndrome
* buffer.
* The encoding puts the calculated syndrome into a given syndrome
* buffer.
* The decoding is a two step process. The first step calculates
* the syndrome over the received (data + syndrome) and calls the
* second stage, which does the decoding / error correction itself.
...
...
@@ -51,7 +51,7 @@ static LIST_HEAD (rslist);
/* Protection for the list */
static
DECLARE_MUTEX
(
rslistlock
);
/**
/**
* rs_init - Initialize a Reed-Solomon codec
*
* @symsize: symbol size, bits (1-8)
...
...
@@ -63,7 +63,7 @@ static DECLARE_MUTEX(rslistlock);
* Allocate a control structure and the polynom arrays for faster
* en/decoding. Fill the arrays according to the given parameters
*/
static
struct
rs_control
*
rs_init
(
int
symsize
,
int
gfpoly
,
int
fcr
,
static
struct
rs_control
*
rs_init
(
int
symsize
,
int
gfpoly
,
int
fcr
,
int
prim
,
int
nroots
)
{
struct
rs_control
*
rs
;
...
...
@@ -124,15 +124,15 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int fcr,
/* Multiply rs->genpoly[] by @**(root + x) */
for
(
j
=
i
;
j
>
0
;
j
--
)
{
if
(
rs
->
genpoly
[
j
]
!=
0
)
{
rs
->
genpoly
[
j
]
=
rs
->
genpoly
[
j
-
1
]
^
rs
->
alpha_to
[
rs_modnn
(
rs
,
rs
->
genpoly
[
j
]
=
rs
->
genpoly
[
j
-
1
]
^
rs
->
alpha_to
[
rs_modnn
(
rs
,
rs
->
index_of
[
rs
->
genpoly
[
j
]]
+
root
)];
}
else
rs
->
genpoly
[
j
]
=
rs
->
genpoly
[
j
-
1
];
}
/* rs->genpoly[0] can never be zero */
rs
->
genpoly
[
0
]
=
rs
->
alpha_to
[
rs_modnn
(
rs
,
rs
->
genpoly
[
0
]
=
rs
->
alpha_to
[
rs_modnn
(
rs
,
rs
->
index_of
[
rs
->
genpoly
[
0
]]
+
root
)];
}
/* convert rs->genpoly[] to index form for quicker encoding */
...
...
@@ -153,7 +153,7 @@ static struct rs_control *rs_init(int symsize, int gfpoly, int fcr,
}
/**
/**
* free_rs - Free the rs control structure, if its not longer used
*
* @rs: the control structure which is not longer used by the
...
...
@@ -173,19 +173,19 @@ void free_rs(struct rs_control *rs)
up
(
&
rslistlock
);
}
/**
/**
* init_rs - Find a matching or allocate a new rs control structure
*
* @symsize: the symbol size (number of bits)
* @gfpoly: the extended Galois field generator polynomial coefficients,
* with the 0th coefficient in the low order bit. The polynomial
* must be primitive;
* @fcr: the first consecutive root of the rs code generator polynomial
* @fcr: the first consecutive root of the rs code generator polynomial
* in index form
* @prim: primitive element to generate polynomial roots
* @nroots: RS code generator polynomial degree (number of roots)
*/
struct
rs_control
*
init_rs
(
int
symsize
,
int
gfpoly
,
int
fcr
,
int
prim
,
struct
rs_control
*
init_rs
(
int
symsize
,
int
gfpoly
,
int
fcr
,
int
prim
,
int
nroots
)
{
struct
list_head
*
tmp
;
...
...
@@ -198,9 +198,9 @@ struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim,
return
NULL
;
if
(
prim
<=
0
||
prim
>=
(
1
<<
symsize
))
return
NULL
;
if
(
nroots
<
0
||
nroots
>=
(
1
<<
symsize
)
||
nroots
>
8
)
if
(
nroots
<
0
||
nroots
>=
(
1
<<
symsize
))
return
NULL
;
down
(
&
rslistlock
);
/* Walk through the list and look for a matching entry */
...
...
@@ -211,9 +211,9 @@ struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim,
if
(
gfpoly
!=
rs
->
gfpoly
)
continue
;
if
(
fcr
!=
rs
->
fcr
)
continue
;
continue
;
if
(
prim
!=
rs
->
prim
)
continue
;
continue
;
if
(
nroots
!=
rs
->
nroots
)
continue
;
/* We have a matching one already */
...
...
@@ -227,18 +227,18 @@ struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim,
rs
->
users
=
1
;
list_add
(
&
rs
->
list
,
&
rslist
);
}
out:
out:
up
(
&
rslistlock
);
return
rs
;
}
#ifdef CONFIG_REED_SOLOMON_ENC8
/**
/**
* encode_rs8 - Calculate the parity for data values (8bit data width)
*
* @rs: the rs control structure
* @data: data field of a given type
* @len: data length
* @len: data length
* @par: parity data, must be initialized by caller (usually all 0)
* @invmsk: invert data mask (will be xored on data)
*
...
...
@@ -246,7 +246,7 @@ struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim,
* symbol size > 8. The calling code must take care of encoding of the
* syndrome result for storage itself.
*/
int
encode_rs8
(
struct
rs_control
*
rs
,
uint8_t
*
data
,
int
len
,
uint16_t
*
par
,
int
encode_rs8
(
struct
rs_control
*
rs
,
uint8_t
*
data
,
int
len
,
uint16_t
*
par
,
uint16_t
invmsk
)
{
#include "encode_rs.c"
...
...
@@ -255,7 +255,7 @@ EXPORT_SYMBOL_GPL(encode_rs8);
#endif
#ifdef CONFIG_REED_SOLOMON_DEC8
/**
/**
* decode_rs8 - Decode codeword (8bit data width)
*
* @rs: the rs control structure
...
...
@@ -273,7 +273,7 @@ EXPORT_SYMBOL_GPL(encode_rs8);
* syndrome result and the received parity before calling this code.
*/
int
decode_rs8
(
struct
rs_control
*
rs
,
uint8_t
*
data
,
uint16_t
*
par
,
int
len
,
uint16_t
*
s
,
int
no_eras
,
int
*
eras_pos
,
uint16_t
invmsk
,
uint16_t
*
s
,
int
no_eras
,
int
*
eras_pos
,
uint16_t
invmsk
,
uint16_t
*
corr
)
{
#include "decode_rs.c"
...
...
@@ -287,13 +287,13 @@ EXPORT_SYMBOL_GPL(decode_rs8);
*
* @rs: the rs control structure
* @data: data field of a given type
* @len: data length
* @len: data length
* @par: parity data, must be initialized by caller (usually all 0)
* @invmsk: invert data mask (will be xored on data, not on parity!)
*
* Each field in the data array contains up to symbol size bits of valid data.
*/
int
encode_rs16
(
struct
rs_control
*
rs
,
uint16_t
*
data
,
int
len
,
uint16_t
*
par
,
int
encode_rs16
(
struct
rs_control
*
rs
,
uint16_t
*
data
,
int
len
,
uint16_t
*
par
,
uint16_t
invmsk
)
{
#include "encode_rs.c"
...
...
@@ -302,7 +302,7 @@ EXPORT_SYMBOL_GPL(encode_rs16);
#endif
#ifdef CONFIG_REED_SOLOMON_DEC16
/**
/**
* decode_rs16 - Decode codeword (16bit data width)
*
* @rs: the rs control structure
...
...
@@ -312,13 +312,13 @@ EXPORT_SYMBOL_GPL(encode_rs16);
* @s: syndrome data field (if NULL, syndrome is calculated)
* @no_eras: number of erasures
* @eras_pos: position of erasures, can be NULL
* @invmsk: invert data mask (will be xored on data, not on parity!)
* @invmsk: invert data mask (will be xored on data, not on parity!)
* @corr: buffer to store correction bitmask on eras_pos
*
* Each field in the data array contains up to symbol size bits of valid data.
*/
int
decode_rs16
(
struct
rs_control
*
rs
,
uint16_t
*
data
,
uint16_t
*
par
,
int
len
,
uint16_t
*
s
,
int
no_eras
,
int
*
eras_pos
,
uint16_t
invmsk
,
uint16_t
*
s
,
int
no_eras
,
int
*
eras_pos
,
uint16_t
invmsk
,
uint16_t
*
corr
)
{
#include "decode_rs.c"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录