1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (C) 2000-2010 Steven J. Hill <sjhill@realitydiluted.com> |
4 | * David Woodhouse <dwmw2@infradead.org> |
5 | * Thomas Gleixner <tglx@linutronix.de> |
6 | * |
7 | * This file is the header for the NAND Hamming ECC implementation. |
8 | */ |
9 | |
10 | #ifndef __MTD_NAND_ECC_SW_HAMMING_H__ |
11 | #define __MTD_NAND_ECC_SW_HAMMING_H__ |
12 | |
13 | #include <linux/mtd/nand.h> |
14 | |
15 | /** |
16 | * struct nand_ecc_sw_hamming_conf - private software Hamming ECC engine structure |
17 | * @req_ctx: Save request context and tweak the original request to fit the |
18 | * engine needs |
19 | * @code_size: Number of bytes needed to store a code (one code per step) |
20 | * @calc_buf: Buffer to use when calculating ECC bytes |
21 | * @code_buf: Buffer to use when reading (raw) ECC bytes from the chip |
22 | * @sm_order: Smart Media special ordering |
23 | */ |
24 | struct nand_ecc_sw_hamming_conf { |
25 | struct nand_ecc_req_tweak_ctx req_ctx; |
26 | unsigned int code_size; |
27 | u8 *calc_buf; |
28 | u8 *code_buf; |
29 | unsigned int sm_order; |
30 | }; |
31 | |
32 | #if IS_ENABLED(CONFIG_MTD_NAND_ECC_SW_HAMMING) |
33 | |
34 | int nand_ecc_sw_hamming_init_ctx(struct nand_device *nand); |
35 | void nand_ecc_sw_hamming_cleanup_ctx(struct nand_device *nand); |
36 | int ecc_sw_hamming_calculate(const unsigned char *buf, unsigned int step_size, |
37 | unsigned char *code, bool sm_order); |
38 | int nand_ecc_sw_hamming_calculate(struct nand_device *nand, |
39 | const unsigned char *buf, |
40 | unsigned char *code); |
41 | int ecc_sw_hamming_correct(unsigned char *buf, unsigned char *read_ecc, |
42 | unsigned char *calc_ecc, unsigned int step_size, |
43 | bool sm_order); |
44 | int nand_ecc_sw_hamming_correct(struct nand_device *nand, unsigned char *buf, |
45 | unsigned char *read_ecc, |
46 | unsigned char *calc_ecc); |
47 | |
48 | #else /* !CONFIG_MTD_NAND_ECC_SW_HAMMING */ |
49 | |
50 | static inline int nand_ecc_sw_hamming_init_ctx(struct nand_device *nand) |
51 | { |
52 | return -ENOTSUPP; |
53 | } |
54 | |
55 | static inline void nand_ecc_sw_hamming_cleanup_ctx(struct nand_device *nand) {} |
56 | |
57 | static inline int ecc_sw_hamming_calculate(const unsigned char *buf, |
58 | unsigned int step_size, |
59 | unsigned char *code, bool sm_order) |
60 | { |
61 | return -ENOTSUPP; |
62 | } |
63 | |
64 | static inline int nand_ecc_sw_hamming_calculate(struct nand_device *nand, |
65 | const unsigned char *buf, |
66 | unsigned char *code) |
67 | { |
68 | return -ENOTSUPP; |
69 | } |
70 | |
71 | static inline int ecc_sw_hamming_correct(unsigned char *buf, |
72 | unsigned char *read_ecc, |
73 | unsigned char *calc_ecc, |
74 | unsigned int step_size, bool sm_order) |
75 | { |
76 | return -ENOTSUPP; |
77 | } |
78 | |
79 | static inline int nand_ecc_sw_hamming_correct(struct nand_device *nand, |
80 | unsigned char *buf, |
81 | unsigned char *read_ecc, |
82 | unsigned char *calc_ecc) |
83 | { |
84 | return -ENOTSUPP; |
85 | } |
86 | |
87 | #endif /* CONFIG_MTD_NAND_ECC_SW_HAMMING */ |
88 | |
89 | #endif /* __MTD_NAND_ECC_SW_HAMMING_H__ */ |
90 | |