Commit 1c63aca3 authored by Akinobu Mita's avatar Akinobu Mita Committed by David Woodhouse

mtd: Add __nand_calculate_ecc() to NAND ECC functions

Add __nand_calculate_ecc() which does not take struct mtd_info.
The built-in 256/512 software ECC calculation and correction tester
will use it.
Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Acked-by: default avatarVimal Singh <vimalsingh@ti.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 3cf60253
...@@ -150,20 +150,19 @@ static const char addressbits[256] = { ...@@ -150,20 +150,19 @@ static const char addressbits[256] = {
}; };
/** /**
* nand_calculate_ecc - [NAND Interface] Calculate 3-byte ECC for 256/512-byte * __nand_calculate_ecc - [NAND Interface] Calculate 3-byte ECC for 256/512-byte
* block * block
* @mtd: MTD block structure
* @buf: input buffer with raw data * @buf: input buffer with raw data
* @eccsize: data bytes per ecc step (256 or 512)
* @code: output buffer with ECC * @code: output buffer with ECC
*/ */
int nand_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf, void __nand_calculate_ecc(const unsigned char *buf, unsigned int eccsize,
unsigned char *code) unsigned char *code)
{ {
int i; int i;
const uint32_t *bp = (uint32_t *)buf; const uint32_t *bp = (uint32_t *)buf;
/* 256 or 512 bytes/ecc */ /* 256 or 512 bytes/ecc */
const uint32_t eccsize_mult = const uint32_t eccsize_mult = eccsize >> 8;
(((struct nand_chip *)mtd->priv)->ecc.size) >> 8;
uint32_t cur; /* current value in buffer */ uint32_t cur; /* current value in buffer */
/* rp0..rp15..rp17 are the various accumulated parities (per byte) */ /* rp0..rp15..rp17 are the various accumulated parities (per byte) */
uint32_t rp0, rp1, rp2, rp3, rp4, rp5, rp6, rp7; uint32_t rp0, rp1, rp2, rp3, rp4, rp5, rp6, rp7;
...@@ -412,6 +411,22 @@ int nand_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf, ...@@ -412,6 +411,22 @@ int nand_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf,
(invparity[par & 0x55] << 2) | (invparity[par & 0x55] << 2) |
(invparity[rp17] << 1) | (invparity[rp17] << 1) |
(invparity[rp16] << 0); (invparity[rp16] << 0);
}
EXPORT_SYMBOL(__nand_calculate_ecc);
/**
* nand_calculate_ecc - [NAND Interface] Calculate 3-byte ECC for 256/512-byte
* block
* @mtd: MTD block structure
* @buf: input buffer with raw data
* @code: output buffer with ECC
*/
int nand_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf,
unsigned char *code)
{
__nand_calculate_ecc(buf,
((struct nand_chip *)mtd->priv)->ecc.size, code);
return 0; return 0;
} }
EXPORT_SYMBOL(nand_calculate_ecc); EXPORT_SYMBOL(nand_calculate_ecc);
......
...@@ -16,7 +16,13 @@ ...@@ -16,7 +16,13 @@
struct mtd_info; struct mtd_info;
/* /*
* Calculate 3 byte ECC code for 256 byte block * Calculate 3 byte ECC code for eccsize byte block
*/
void __nand_calculate_ecc(const u_char *dat, unsigned int eccsize,
u_char *ecc_code);
/*
* Calculate 3 byte ECC code for 256/512 byte block
*/ */
int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code); int nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code);
...@@ -27,7 +33,7 @@ int __nand_correct_data(u_char *dat, u_char *read_ecc, u_char *calc_ecc, ...@@ -27,7 +33,7 @@ int __nand_correct_data(u_char *dat, u_char *read_ecc, u_char *calc_ecc,
unsigned int eccsize); unsigned int eccsize);
/* /*
* Detect and correct a 1 bit error for 256 byte block * Detect and correct a 1 bit error for 256/512 byte block
*/ */
int nand_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc); int nand_correct_data(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment