Commit | Line | Data |
---|---|---|
801c135c AB |
1 | /* |
2 | * Copyright (c) International Business Machines Corp., 2006 | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation; either version 2 of the License, or | |
7 | * (at your option) any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See | |
12 | * the GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program; if not, write to the Free Software | |
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
17 | * | |
18 | * Author: Artem Bityutskiy (Битюцкий Артём) | |
19 | */ | |
20 | ||
21 | #ifndef __UBI_DEBUG_H__ | |
22 | #define __UBI_DEBUG_H__ | |
23 | ||
ef7088e7 | 24 | void ubi_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len); |
a904e3f1 AB |
25 | void ubi_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr); |
26 | void ubi_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr); | |
ef7088e7 | 27 | |
801c135c AB |
28 | #include <linux/random.h> |
29 | ||
c8566350 | 30 | #define ubi_assert(expr) do { \ |
f2863c54 | 31 | if (unlikely(!(expr))) { \ |
e28453bb | 32 | pr_crit("UBI assert failed in %s at %u (pid %d)\n", \ |
f2863c54 | 33 | __func__, __LINE__, current->pid); \ |
25886a36 | 34 | dump_stack(); \ |
f2863c54 | 35 | } \ |
c8566350 | 36 | } while (0) |
801c135c | 37 | |
e28453bb | 38 | #define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) \ |
31532494 AB |
39 | print_hex_dump(l, ps, pt, r, g, b, len, a) |
40 | ||
ab50ff68 | 41 | #define ubi_dbg_msg(type, fmt, ...) \ |
183ae6cf AB |
42 | pr_debug("UBI DBG " type " (pid %d): " fmt "\n", current->pid, \ |
43 | ##__VA_ARGS__) | |
801c135c | 44 | |
ab50ff68 AB |
45 | /* General debugging messages */ |
46 | #define dbg_gen(fmt, ...) ubi_dbg_msg("gen", fmt, ##__VA_ARGS__) | |
85c6e6e2 | 47 | /* Messages from the eraseblock association sub-system */ |
ab50ff68 | 48 | #define dbg_eba(fmt, ...) ubi_dbg_msg("eba", fmt, ##__VA_ARGS__) |
85c6e6e2 | 49 | /* Messages from the wear-leveling sub-system */ |
ab50ff68 | 50 | #define dbg_wl(fmt, ...) ubi_dbg_msg("wl", fmt, ##__VA_ARGS__) |
85c6e6e2 | 51 | /* Messages from the input/output sub-system */ |
ab50ff68 | 52 | #define dbg_io(fmt, ...) ubi_dbg_msg("io", fmt, ##__VA_ARGS__) |
801c135c | 53 | /* Initialization and build messages */ |
ab50ff68 AB |
54 | #define dbg_bld(fmt, ...) ubi_dbg_msg("bld", fmt, ##__VA_ARGS__) |
55 | ||
766381f0 | 56 | void ubi_dump_vol_info(const struct ubi_volume *vol); |
1f021e1d | 57 | void ubi_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx); |
517af48c | 58 | void ubi_dump_av(const struct ubi_ainf_volume *av); |
2c5ec5ce | 59 | void ubi_dump_aeb(const struct ubi_ainf_peb *aeb, int type); |
718c00bb | 60 | void ubi_dump_mkvol_req(const struct ubi_mkvol_req *req); |
97d6104b AB |
61 | int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, |
62 | int len); | |
2a734bb8 AB |
63 | int ubi_debugfs_init(void); |
64 | void ubi_debugfs_exit(void); | |
65 | int ubi_debugfs_init_dev(struct ubi_device *ubi); | |
66 | void ubi_debugfs_exit_dev(struct ubi_device *ubi); | |
92d124f5 | 67 | |
28237e45 AB |
68 | /** |
69 | * ubi_dbg_is_bgt_disabled - if the background thread is disabled. | |
27a0f2a3 | 70 | * @ubi: UBI device description object |
28237e45 AB |
71 | * |
72 | * Returns non-zero if the UBI background thread is disabled for testing | |
73 | * purposes. | |
74 | */ | |
27a0f2a3 | 75 | static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi) |
28237e45 | 76 | { |
eab73772 | 77 | return ubi->dbg.disable_bgt; |
28237e45 | 78 | } |
c8566350 | 79 | |
801c135c AB |
80 | /** |
81 | * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. | |
27a0f2a3 | 82 | * @ubi: UBI device description object |
801c135c AB |
83 | * |
84 | * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. | |
85 | */ | |
27a0f2a3 | 86 | static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi) |
801c135c | 87 | { |
eab73772 | 88 | if (ubi->dbg.emulate_bitflips) |
aca662a3 | 89 | return !(prandom_u32() % 200); |
28237e45 | 90 | return 0; |
801c135c | 91 | } |
801c135c | 92 | |
801c135c AB |
93 | /** |
94 | * ubi_dbg_is_write_failure - if it is time to emulate a write failure. | |
27a0f2a3 | 95 | * @ubi: UBI device description object |
801c135c AB |
96 | * |
97 | * Returns non-zero if a write failure should be emulated, otherwise returns | |
98 | * zero. | |
99 | */ | |
27a0f2a3 | 100 | static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi) |
801c135c | 101 | { |
eab73772 | 102 | if (ubi->dbg.emulate_io_failures) |
aca662a3 | 103 | return !(prandom_u32() % 500); |
28237e45 | 104 | return 0; |
801c135c | 105 | } |
801c135c | 106 | |
801c135c AB |
107 | /** |
108 | * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. | |
27a0f2a3 | 109 | * @ubi: UBI device description object |
801c135c AB |
110 | * |
111 | * Returns non-zero if an erase failure should be emulated, otherwise returns | |
112 | * zero. | |
113 | */ | |
27a0f2a3 | 114 | static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi) |
801c135c | 115 | { |
eab73772 | 116 | if (ubi->dbg.emulate_io_failures) |
aca662a3 | 117 | return !(prandom_u32() % 400); |
28237e45 | 118 | return 0; |
801c135c | 119 | } |
801c135c | 120 | |
64575574 EG |
121 | static inline int ubi_dbg_chk_io(const struct ubi_device *ubi) |
122 | { | |
eab73772 | 123 | return ubi->dbg.chk_io; |
64575574 EG |
124 | } |
125 | ||
126 | static inline int ubi_dbg_chk_gen(const struct ubi_device *ubi) | |
127 | { | |
eab73772 | 128 | return ubi->dbg.chk_gen; |
64575574 | 129 | } |
801c135c | 130 | #endif /* !__UBI_DEBUG_H__ */ |