aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi/debug.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/ubi/debug.h')
-rw-r--r--drivers/mtd/ubi/debug.h113
1 files changed, 66 insertions, 47 deletions
diff --git a/drivers/mtd/ubi/debug.h b/drivers/mtd/ubi/debug.h
index 3f1a09c5c438..65b5b76cc379 100644
--- a/drivers/mtd/ubi/debug.h
+++ b/drivers/mtd/ubi/debug.h
@@ -21,14 +21,6 @@
21#ifndef __UBI_DEBUG_H__ 21#ifndef __UBI_DEBUG_H__
22#define __UBI_DEBUG_H__ 22#define __UBI_DEBUG_H__
23 23
24struct ubi_ec_hdr;
25struct ubi_vid_hdr;
26struct ubi_volume;
27struct ubi_vtbl_record;
28struct ubi_scan_volume;
29struct ubi_scan_leb;
30struct ubi_mkvol_req;
31
32#ifdef CONFIG_MTD_UBI_DEBUG 24#ifdef CONFIG_MTD_UBI_DEBUG
33#include <linux/random.h> 25#include <linux/random.h>
34 26
@@ -71,86 +63,103 @@ void ubi_dbg_dump_sv(const struct ubi_scan_volume *sv);
71void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type); 63void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type);
72void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req); 64void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
73void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len); 65void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len);
74
75extern unsigned int ubi_chk_flags;
76
77/*
78 * Debugging check flags.
79 *
80 * UBI_CHK_GEN: general checks
81 * UBI_CHK_IO: check writes and erases
82 */
83enum {
84 UBI_CHK_GEN = 0x1,
85 UBI_CHK_IO = 0x2,
86};
87
88int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len); 66int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len);
89int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum, 67int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
90 int offset, int len); 68 int offset, int len);
91 69int ubi_debugging_init_dev(struct ubi_device *ubi);
92extern unsigned int ubi_tst_flags; 70void ubi_debugging_exit_dev(struct ubi_device *ubi);
71int ubi_debugfs_init(void);
72void ubi_debugfs_exit(void);
73int ubi_debugfs_init_dev(struct ubi_device *ubi);
74void ubi_debugfs_exit_dev(struct ubi_device *ubi);
93 75
94/* 76/*
95 * Special testing flags. 77 * The UBI debugfs directory name pattern and maximum name length (3 for "ubi"
78 * + 2 for the number plus 1 for the trailing zero byte.
79 */
80#define UBI_DFS_DIR_NAME "ubi%d"
81#define UBI_DFS_DIR_LEN (3 + 2 + 1)
82
83/**
84 * struct ubi_debug_info - debugging information for an UBI device.
96 * 85 *
97 * UBIFS_TST_DISABLE_BGT: disable the background thread 86 * @chk_gen: if UBI general extra checks are enabled
98 * UBI_TST_EMULATE_BITFLIPS: emulate bit-flips 87 * @chk_io: if UBI I/O extra checks are enabled
99 * UBI_TST_EMULATE_WRITE_FAILURES: emulate write failures 88 * @disable_bgt: disable the background task for testing purposes
100 * UBI_TST_EMULATE_ERASE_FAILURES: emulate erase failures 89 * @emulate_bitflips: emulate bit-flips for testing purposes
90 * @emulate_io_failures: emulate write/erase failures for testing purposes
91 * @dfs_dir_name: name of debugfs directory containing files of this UBI device
92 * @dfs_dir: direntry object of the UBI device debugfs directory
93 * @dfs_chk_gen: debugfs knob to enable UBI general extra checks
94 * @dfs_chk_io: debugfs knob to enable UBI I/O extra checks
95 * @dfs_disable_bgt: debugfs knob to disable the background task
96 * @dfs_emulate_bitflips: debugfs knob to emulate bit-flips
97 * @dfs_emulate_io_failures: debugfs knob to emulate write/erase failures
101 */ 98 */
102enum { 99struct ubi_debug_info {
103 UBI_TST_DISABLE_BGT = 0x1, 100 unsigned int chk_gen:1;
104 UBI_TST_EMULATE_BITFLIPS = 0x2, 101 unsigned int chk_io:1;
105 UBI_TST_EMULATE_WRITE_FAILURES = 0x4, 102 unsigned int disable_bgt:1;
106 UBI_TST_EMULATE_ERASE_FAILURES = 0x8, 103 unsigned int emulate_bitflips:1;
104 unsigned int emulate_io_failures:1;
105 char dfs_dir_name[UBI_DFS_DIR_LEN + 1];
106 struct dentry *dfs_dir;
107 struct dentry *dfs_chk_gen;
108 struct dentry *dfs_chk_io;
109 struct dentry *dfs_disable_bgt;
110 struct dentry *dfs_emulate_bitflips;
111 struct dentry *dfs_emulate_io_failures;
107}; 112};
108 113
109/** 114/**
110 * ubi_dbg_is_bgt_disabled - if the background thread is disabled. 115 * ubi_dbg_is_bgt_disabled - if the background thread is disabled.
116 * @ubi: UBI device description object
111 * 117 *
112 * Returns non-zero if the UBI background thread is disabled for testing 118 * Returns non-zero if the UBI background thread is disabled for testing
113 * purposes. 119 * purposes.
114 */ 120 */
115static inline int ubi_dbg_is_bgt_disabled(void) 121static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi)
116{ 122{
117 return ubi_tst_flags & UBI_TST_DISABLE_BGT; 123 return ubi->dbg->disable_bgt;
118} 124}
119 125
120/** 126/**
121 * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. 127 * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip.
128 * @ubi: UBI device description object
122 * 129 *
123 * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. 130 * Returns non-zero if a bit-flip should be emulated, otherwise returns zero.
124 */ 131 */
125static inline int ubi_dbg_is_bitflip(void) 132static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi)
126{ 133{
127 if (ubi_tst_flags & UBI_TST_EMULATE_BITFLIPS) 134 if (ubi->dbg->emulate_bitflips)
128 return !(random32() % 200); 135 return !(random32() % 200);
129 return 0; 136 return 0;
130} 137}
131 138
132/** 139/**
133 * ubi_dbg_is_write_failure - if it is time to emulate a write failure. 140 * ubi_dbg_is_write_failure - if it is time to emulate a write failure.
141 * @ubi: UBI device description object
134 * 142 *
135 * Returns non-zero if a write failure should be emulated, otherwise returns 143 * Returns non-zero if a write failure should be emulated, otherwise returns
136 * zero. 144 * zero.
137 */ 145 */
138static inline int ubi_dbg_is_write_failure(void) 146static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi)
139{ 147{
140 if (ubi_tst_flags & UBI_TST_EMULATE_WRITE_FAILURES) 148 if (ubi->dbg->emulate_io_failures)
141 return !(random32() % 500); 149 return !(random32() % 500);
142 return 0; 150 return 0;
143} 151}
144 152
145/** 153/**
146 * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. 154 * ubi_dbg_is_erase_failure - if its time to emulate an erase failure.
155 * @ubi: UBI device description object
147 * 156 *
148 * Returns non-zero if an erase failure should be emulated, otherwise returns 157 * Returns non-zero if an erase failure should be emulated, otherwise returns
149 * zero. 158 * zero.
150 */ 159 */
151static inline int ubi_dbg_is_erase_failure(void) 160static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi)
152{ 161{
153 if (ubi_tst_flags & UBI_TST_EMULATE_ERASE_FAILURES) 162 if (ubi->dbg->emulate_io_failures)
154 return !(random32() % 400); 163 return !(random32() % 400);
155 return 0; 164 return 0;
156} 165}
@@ -201,11 +210,6 @@ static inline void ubi_dbg_dump_flash(struct ubi_device *ubi,
201static inline void 210static inline void
202ubi_dbg_print_hex_dump(const char *l, const char *ps, int pt, int r, 211ubi_dbg_print_hex_dump(const char *l, const char *ps, int pt, int r,
203 int g, const void *b, size_t len, bool a) { return; } 212 int g, const void *b, size_t len, bool a) { return; }
204
205static inline int ubi_dbg_is_bgt_disabled(void) { return 0; }
206static inline int ubi_dbg_is_bitflip(void) { return 0; }
207static inline int ubi_dbg_is_write_failure(void) { return 0; }
208static inline int ubi_dbg_is_erase_failure(void) { return 0; }
209static inline int ubi_dbg_check_all_ff(struct ubi_device *ubi, 213static inline int ubi_dbg_check_all_ff(struct ubi_device *ubi,
210 int pnum, int offset, 214 int pnum, int offset,
211 int len) { return 0; } 215 int len) { return 0; }
@@ -213,5 +217,20 @@ static inline int ubi_dbg_check_write(struct ubi_device *ubi,
213 const void *buf, int pnum, 217 const void *buf, int pnum,
214 int offset, int len) { return 0; } 218 int offset, int len) { return 0; }
215 219
220static inline int ubi_debugging_init_dev(struct ubi_device *ubi) { return 0; }
221static inline void ubi_debugging_exit_dev(struct ubi_device *ubi) { return; }
222static inline int ubi_debugfs_init(void) { return 0; }
223static inline void ubi_debugfs_exit(void) { return; }
224static inline int ubi_debugfs_init_dev(struct ubi_device *ubi) { return 0; }
225static inline void ubi_debugfs_exit_dev(struct ubi_device *ubi) { return; }
226
227static inline int
228ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi) { return 0; }
229static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi) { return 0; }
230static inline int
231ubi_dbg_is_write_failure(const struct ubi_device *ubi) { return 0; }
232static inline int
233ubi_dbg_is_erase_failure(const struct ubi_device *ubi) { return 0; }
234
216#endif /* !CONFIG_MTD_UBI_DEBUG */ 235#endif /* !CONFIG_MTD_UBI_DEBUG */
217#endif /* !__UBI_DEBUG_H__ */ 236#endif /* !__UBI_DEBUG_H__ */