error.h (8973B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 */ 7 8 #ifndef _SOCDNX_ERROR_H 9 #define _SOCDNX_ERROR_H 10 11 #include <soc/dcmn/dcmn_gen_err.h> 12 #include <shared/error.h> 13 #include <shared/bsl.h> 14 #ifdef BCM_DPP_SUPPORT 15 #include <soc/drv.h> 16 #include <soc/dpp/error.h> 17 #include <soc/dpp/debug.h> 18 #include <soc/dpp/SAND/Management/sand_general_macros.h> 19 #endif /* BCM_DPP_SUPPORT */ 20 21 #if defined(BROADCOM_DEBUG) 22 23 /* 24 * Unified message format for all modules 25 * In order to use this format _ERR_MSG_MODULE_NAME must be defined 26 * For example in Fabric module the following will be in top of the c file: 27 * #ifdef _ERR_MSG_MODULE_NAME 28 * #error "_ERR_MSG_MODULE_NAME redefined" 29 * #endif 30 * #define _ERR_MSG_MODULE_NAME FABRIC 31 * And in the bottom: 32 * #undef _ERR_MSG_MODULE_NAME 33 */ 34 #define _SOCDNX_MSG(string) string "\n" 35 #define _SOCDNX_MSG_NO_UNIT(string) string "\n" 36 37 #define _BSL_SOCDNX_MSG(string) _ERR_MSG_MODULE_NAME, unit, string "\n" 38 #define _BSL_SOCDNX_MSG_NO_UNIT(string) _ERR_MSG_MODULE_NAME, BSL_UNIT_UNKNOWN, string "\n" 39 40 #else /* defined(BROADCOM_DEBUG) */ 41 #define _SOCDNX_MSG(string) string 42 #define _SOCDNX_MSG_W_UNIT(string) string 43 #define _SOCDNX_MSG_NO_UNIT(string) string 44 45 #define _BSL_SOCDNX_MSG(string) _ERR_MSG_MODULE_NAME, unit, string 46 #define _BSL_SOCDNX_MSG_NO_UNIT(string) _ERR_MSG_MODULE_NAME, unit, string 47 48 #endif /* defined(BROADCOM_DEBUG) */ 49 #define _BSL_SOCDNX_MSG_STR(string) _ERR_MSG_MODULE_NAME, unit, string 50 /*Following macro independent of SOCDNX_INIT_FUNC_DEFS and related macros.*/ 51 #define SOCDNX_IF_ERR_RETURN(_rv) \ 52 do { \ 53 int __rv__ = _rv; \ 54 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __rv__); \ 55 if (__rv__ != SOC_E_NONE) { \ 56 _bsl_error(_BSL_SOCDNX_MSG("%s"),soc_errmsg(__rv__)); \ 57 return __rv__; \ 58 } \ 59 } while (0) 60 61 #define _BSL_SOCDNX_VVERBOSE_MSG(string) _ERR_MSG_MODULE_NAME, unit, "%s[%d]%s unit: %d " string "\n", __FILE__, __LINE__, FUNCTION_NAME(), unit 62 63 /* Must appear at each function right after parameters definition */ 64 #define SOCDNX_INIT_FUNC_DEFS \ 65 int _rv = SOC_E_NONE, _lock_taken = 0; \ 66 (void)_lock_taken; \ 67 _bsl_vverbose(_BSL_SOCDNX_VVERBOSE_MSG("enter")); 68 69 #define SOCDNX_FUNC_ERROR \ 70 SOC_FAILURE(_rv) 71 72 #define SOCDNX_FUNC_RETURN \ 73 _bsl_vverbose(_BSL_SOCDNX_VVERBOSE_MSG("exit")); \ 74 return _rv; 75 76 #define SOCDNX_FUNC_RETURN_VOID \ 77 _bsl_vverbose(_BSL_SOCDNX_VVERBOSE_MSG("exit"));\ 78 COMPILER_REFERENCE(_rv); 79 80 #define SOCDNX_IF_ERR_CONT(_rc) \ 81 do { \ 82 int __err__rc = _rc; \ 83 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __err__rc); \ 84 if(__err__rc != SOC_E_NONE) { \ 85 _bsl_warn(_BSL_SOCDNX_MSG("%s"),soc_errmsg(__err__rc)); \ 86 _rv = __err__rc; \ 87 } \ 88 } while(0) 89 90 #define SOCDNX_SAND_IF_ERR_CONT(_sand_ret) \ 91 do { \ 92 int __err__rc;\ 93 int error_code = soc_sand_get_error_code_from_error_word(_sand_ret);\ 94 __err__rc = (error_code == SOC_SAND_OK) ? SOC_E_NONE : SOC_E_FAIL;\ 95 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __err__rc); \ 96 if(__err__rc != SOC_E_NONE) { \ 97 _bsl_warn(_BSL_SOCDNX_MSG("%s"),soc_errmsg(__err__rc)); \ 98 _rv = __err__rc; \ 99 } \ 100 } while(0) 101 102 #define SOCDNX_IF_ERR_EXIT(_rc) \ 103 do { \ 104 int __err__rc = _rc; \ 105 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __err__rc); \ 106 if(__err__rc != SOC_E_NONE) { \ 107 _bsl_error(_BSL_SOCDNX_MSG("%s"),soc_errmsg(__err__rc)); \ 108 _rv = __err__rc; \ 109 SOC_EXIT; \ 110 } \ 111 } while(0) 112 113 /* meant for use after exit: , In case of error log it and if it is the first error, update _rv */ 114 #define SOCDNX_IF_ERR_REPORT(_rc) \ 115 do { \ 116 int __err__rc = _rc; \ 117 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __err__rc); \ 118 if(__err__rc != SOC_E_NONE) { \ 119 _bsl_error(_BSL_SOCDNX_MSG("%s"),soc_errmsg(__err__rc)); \ 120 if (_rv != SOC_E_NONE) _rv = __err__rc; \ 121 } \ 122 } while(0) 123 124 #define SOCDNX_IF_ERR_EXIT_NO_UNIT(_rc) \ 125 do { \ 126 int __err__rc = _rc; \ 127 if(__err__rc != SOC_E_NONE) { \ 128 _bsl_error(_BSL_SOCDNX_MSG_NO_UNIT("%s"),soc_errmsg(__err__rc)); \ 129 _rv = __err__rc; \ 130 SOC_EXIT; \ 131 } \ 132 } while(0) 133 134 135 #define SOCDNX_SAND_IF_ERR_RETURN(_sand_ret) \ 136 do { \ 137 soc_error_t _rv = handle_sand_result(_sand_ret); \ 138 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, _rv); \ 139 if (_rv != SOC_E_NONE) { \ 140 _bsl_error(_BSL_SOCDNX_MSG("%s"),soc_errmsg(_rv)); \ 141 return _rv; \ 142 } \ 143 } while (0) 144 145 #define SOCDNX_SAND_IF_ERR_EXIT(_sand_ret) \ 146 do { \ 147 int __err__rc = handle_sand_result(_sand_ret); \ 148 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __err__rc); \ 149 if(__err__rc != SOC_E_NONE) { \ 150 _bsl_error(_BSL_SOCDNX_MSG("%s"),soc_errmsg(_rv)); \ 151 _rv = __err__rc; \ 152 SOC_EXIT; \ 153 } \ 154 } while(0) 155 156 #define SOCDNX_SAND_IF_ERR_EXIT_MSG(_sand_ret, stuff) \ 157 do { \ 158 int __err__rc = handle_sand_result(_sand_ret); \ 159 GEN_ERR_CHK(unit, GEN_ERR_TYPE_SOC, __err__rc); \ 160 if(__err__rc != SOC_E_NONE) { \ 161 SOCDNX_EXIT_WITH_ERR(__err__rc, stuff); \ 162 } \ 163 } while(0) 164 165 166 #define SOCDNX_EXIT_WITH_ERR(_rc, stuff) \ 167 do { \ 168 _bsl_error stuff ; \ 169 _rv = _rc; \ 170 SOC_EXIT; \ 171 } while(0) 172 173 #define SOCDNX_EXIT_WITH_ERR_NO_MSG(_rc) \ 174 do { \ 175 _rv = _rc; \ 176 SOC_EXIT; \ 177 } while(0) 178 179 #define SOCDNX_IF_ERR_EXIT_MSG(_rc, stuff) \ 180 do { \ 181 int __err__rc = _rc; \ 182 if(__err__rc != SOC_E_NONE) { \ 183 _bsl_error stuff ; \ 184 _rv = __err__rc; \ 185 SOC_EXIT; \ 186 } \ 187 /* Coverity: the dead code is empty */ \ 188 /* coverity[dead_error_line:FALSE] */ \ 189 } while (0); 190 191 #define SOCDNX_NULL_CHECK(arg) \ 192 do { \ 193 if ((arg) == NULL) \ 194 { SOCDNX_EXIT_WITH_ERR(SOC_E_PARAM,(_BSL_SOCDNX_MSG("null parameter" ))); } \ 195 } while (0) 196 197 #define SOCDNX_FREE(arg) \ 198 do { \ 199 if(arg != NULL) \ 200 {sal_free(arg);} \ 201 } while (0) 202 203 #define SOCDNX_ALLOC(var, type, count,str) \ 204 do { \ 205 if(var != NULL) \ 206 { \ 207 SOCDNX_EXIT_WITH_ERR(SOC_E_PARAM, (_BSL_SOCDNX_MSG("Trying to allocate to a non null ptr is forbidden"))); \ 208 } \ 209 var = (type*)sal_alloc((count) * sizeof(type),str); \ 210 if (var == NULL) \ 211 { \ 212 SOCDNX_EXIT_WITH_ERR(SOC_E_MEMORY, (_BSL_SOCDNX_MSG("Allocating failed"))); \ 213 } \ 214 sal_memset( \ 215 var, \ 216 0x0, \ 217 (size_t) ((count) * sizeof(type)) \ 218 ); \ 219 } while(0) 220 221 #ifdef BROADCOM_DEBUG 222 #define SOCDNX_VERIFY(exp) if (!(exp)) { SOCDNX_EXIT_WITH_ERR(SOC_E_INTERNAL, (_BSL_SOCDNX_MSG("VERIFY FAILED (%s:%d): %s\n"), __FILE__, __LINE__, #exp)); } 223 #else 224 #define SOCDNX_VERIFY(exp) ((void)0) 225 #endif 226 227 #ifdef DCMN_RUNTIME_DEBUG 228 typedef enum { 229 dcmn_runtime_debug_state_loading = 0, 230 dcmn_runtime_debug_state_initializing = 1, 231 dcmn_runtime_debug_state_running = 2 232 } dcmn_runtime_debug_state_t; 233 typedef struct { 234 sal_time_t start_time; 235 sal_time_t last_time; 236 dcmn_runtime_debug_state_t run_stage; 237 } dcmn_runtime_debug_t; 238 extern dcmn_runtime_debug_t dcmn_runtime_debug_per_device[SOC_MAX_NUM_DEVICES]; 239 240 void dcmn_runtime_debug_update_print_time(int unit, const char *string_to_print); 241 242 #define DCMN_RUNTIME_DEBUG_PRINT(unit) dcmn_runtime_debug_update_print_time(unit, "") 243 #define DCMN_RUNTIME_DEBUG_PRINT_LOC(unit, location) dcmn_runtime_debug_update_print_time(unit, (location)) 244 #else /* DCMN_RUNTIME_DEBUG */ 245 #define DCMN_RUNTIME_DEBUG_PRINT(unit) 246 #define DCMN_RUNTIME_DEBUG_PRINT_LOC(unit, location) 247 #endif /* DCMN_RUNTIME_DEBUG */ 248 249 /*PCID LITE VERSION - skip code not relevant for arrakis in order to improve init time*/ 250 #ifdef BCM_PCID_LITE 251 #define SOCDNX_PCID_LITE_SKIP(unit) \ 252 SOC_EXIT 253 #else 254 #define SOCDNX_PCID_LITE_SKIP(unit) 255 #endif 256 257 #endif /* !_SOCDNX_ERROR_H */