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 44enum 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 54struct 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 63extern struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS]; 64 65int ctcm_register_dbf_views(void); 66void ctcm_unregister_dbf_views(void); 67void ctcm_dbf_longtext(enum ctcm_dbf_names dbf_nix, int level, char *text, ...); 68 69static 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