1 /* 2 * Copyright IBM Corp. 2001, 2007 3 * Authors: Peter Tiedemann (ptiedem@de.ibm.com) 4 * 5 */ 6 7 #ifndef _CTCM_DBUG_H_ 8 #define _CTCM_DBUG_H_ 9 10 /* 11 * Debug Facility stuff 12 */ 13 14 #include <asm/debug.h> 15 16 #ifdef DEBUG 17 #define do_debug 1 18 #else 19 #define do_debug 0 20 #endif 21 #ifdef DEBUGCCW 22 #define do_debug_ccw 1 23 #define DEBUGDATA 1 24 #else 25 #define do_debug_ccw 0 26 #endif 27 #ifdef DEBUGDATA 28 #define do_debug_data 1 29 #else 30 #define do_debug_data 0 31 #endif 32 33 /* define dbf debug levels similar to kernel msg levels */ 34 #define CTC_DBF_ALWAYS 0 /* always print this */ 35 #define CTC_DBF_EMERG 0 /* system is unusable */ 36 #define CTC_DBF_ALERT 1 /* action must be taken immediately */ 37 #define CTC_DBF_CRIT 2 /* critical conditions */ 38 #define CTC_DBF_ERROR 3 /* error conditions */ 39 #define CTC_DBF_WARN 4 /* warning conditions */ 40 #define CTC_DBF_NOTICE 5 /* normal but significant condition */ 41 #define CTC_DBF_INFO 5 /* informational */ 42 #define CTC_DBF_DEBUG 6 /* debug-level messages */ 43 44 enum ctcm_dbf_names { 45 CTCM_DBF_SETUP, 46 CTCM_DBF_ERROR, 47 CTCM_DBF_TRACE, 48 CTCM_DBF_MPC_SETUP, 49 CTCM_DBF_MPC_ERROR, 50 CTCM_DBF_MPC_TRACE, 51 CTCM_DBF_INFOS /* must be last element */ 52 }; 53 54 struct ctcm_dbf_info { 55 char name[DEBUG_MAX_NAME_LEN]; 56 int pages; 57 int areas; 58 int len; 59 int level; 60 debug_info_t *id; 61 }; 62 63 extern struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS]; 64 65 int ctcm_register_dbf_views(void); 66 void ctcm_unregister_dbf_views(void); 67 void ctcm_dbf_longtext(enum ctcm_dbf_names dbf_nix, int level, char *text, ...); 68 69 static inline const char *strtail(const char *s, int n) 70 { 71 int l = strlen(s); 72 return (l > n) ? s + (l - n) : s; 73 } 74 75 #define CTCM_FUNTAIL strtail((char *)__func__, 16) 76 77 #define CTCM_DBF_TEXT(name, level, text) \ 78 do { \ 79 debug_text_event(ctcm_dbf[CTCM_DBF_##name].id, level, text); \ 80 } while (0) 81 82 #define CTCM_DBF_HEX(name, level, addr, len) \ 83 do { \ 84 debug_event(ctcm_dbf[CTCM_DBF_##name].id, \ 85 level, (void *)(addr), len); \ 86 } while (0) 87 88 #define CTCM_DBF_TEXT_(name, level, text...) \ 89 ctcm_dbf_longtext(CTCM_DBF_##name, level, text) 90 91 /* 92 * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}. 93 * dev : netdevice with valid name field. 94 * text: any text string. 95 */ 96 #define CTCM_DBF_DEV_NAME(cat, dev, text) \ 97 do { \ 98 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%s) :- %s", \ 99 CTCM_FUNTAIL, dev->name, text); \ 100 } while (0) 101 102 #define MPC_DBF_DEV_NAME(cat, dev, text) \ 103 do { \ 104 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%s) := %s", \ 105 CTCM_FUNTAIL, dev->name, text); \ 106 } while (0) 107 108 #define CTCMY_DBF_DEV_NAME(cat, dev, text) \ 109 do { \ 110 if (IS_MPCDEV(dev)) \ 111 MPC_DBF_DEV_NAME(cat, dev, text); \ 112 else \ 113 CTCM_DBF_DEV_NAME(cat, dev, text); \ 114 } while (0) 115 116 /* 117 * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}. 118 * dev : netdevice. 119 * text: any text string. 120 */ 121 #define CTCM_DBF_DEV(cat, dev, text) \ 122 do { \ 123 CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%p) :-: %s", \ 124 CTCM_FUNTAIL, dev, text); \ 125 } while (0) 126 127 #define MPC_DBF_DEV(cat, dev, text) \ 128 do { \ 129 CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%p) :=: %s", \ 130 CTCM_FUNTAIL, dev, text); \ 131 } while (0) 132 133 #define CTCMY_DBF_DEV(cat, dev, text) \ 134 do { \ 135 if (IS_MPCDEV(dev)) \ 136 MPC_DBF_DEV(cat, dev, text); \ 137 else \ 138 CTCM_DBF_DEV(cat, dev, text); \ 139 } while (0) 140 141 #endif 142