openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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 */