1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Extended Trap data component interface file. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10*4882a593Smuzhiyun * following added to such license: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 18*4882a593Smuzhiyun * modifications of the software. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Dual:>> 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef _ETD_H_ 25*4882a593Smuzhiyun #define _ETD_H_ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #if defined(ETD) && !defined(WLETD) 28*4882a593Smuzhiyun #include <hnd_trap.h> 29*4882a593Smuzhiyun #endif 30*4882a593Smuzhiyun #include <bcmutils.h> 31*4882a593Smuzhiyun /* Tags for structures being used by etd info iovar. 32*4882a593Smuzhiyun * Related structures are defined in wlioctl.h. 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun #define ETD_TAG_JOIN_CLASSIFICATION_INFO 10 /* general information about join request */ 35*4882a593Smuzhiyun #define ETD_TAG_JOIN_TARGET_CLASSIFICATION_INFO 11 /* per target (AP) join information */ 36*4882a593Smuzhiyun #define ETD_TAG_ASSOC_STATE 12 /* current state of the Device association state machine */ 37*4882a593Smuzhiyun #define ETD_TAG_CHANNEL 13 /* current channel on which the association was performed */ 38*4882a593Smuzhiyun #define ETD_TAG_TOTAL_NUM_OF_JOIN_ATTEMPTS 14 /* number of join attempts (bss_retries) */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define PSMDBG_REG_READ_CNT_FOR_PSMWDTRAP_V1 3 41*4882a593Smuzhiyun #define PSMDBG_REG_READ_CNT_FOR_PSMWDTRAP_V2 6 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #ifndef _LANGUAGE_ASSEMBLY 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define HND_EXTENDED_TRAP_VERSION 1 46*4882a593Smuzhiyun #define HND_EXTENDED_TRAP_BUFLEN 512 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun typedef struct hnd_ext_trap_hdr { 49*4882a593Smuzhiyun uint8 version; /* Extended trap version info */ 50*4882a593Smuzhiyun uint8 reserved; /* currently unused */ 51*4882a593Smuzhiyun uint16 len; /* Length of data excluding this header */ 52*4882a593Smuzhiyun uint8 data[]; /* TLV data */ 53*4882a593Smuzhiyun } hnd_ext_trap_hdr_t; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun typedef enum { 56*4882a593Smuzhiyun TAG_TRAP_NONE = 0u, /* None trap type */ 57*4882a593Smuzhiyun TAG_TRAP_SIGNATURE = 1u, /* Processor register dumps */ 58*4882a593Smuzhiyun TAG_TRAP_STACK = 2u, /* Processor stack dump (possible code locations) */ 59*4882a593Smuzhiyun TAG_TRAP_MEMORY = 3u, /* Memory subsystem dump */ 60*4882a593Smuzhiyun TAG_TRAP_DEEPSLEEP = 4u, /* Deep sleep health check failures */ 61*4882a593Smuzhiyun TAG_TRAP_PSM_WD = 5u, /* PSM watchdog information */ 62*4882a593Smuzhiyun TAG_TRAP_PHY = 6u, /* Phy related issues */ 63*4882a593Smuzhiyun TAG_TRAP_BUS = 7u, /* Bus level issues */ 64*4882a593Smuzhiyun TAG_TRAP_MAC_SUSP = 8u, /* Mac level suspend issues */ 65*4882a593Smuzhiyun TAG_TRAP_BACKPLANE = 9u, /* Backplane related errors */ 66*4882a593Smuzhiyun /* Values 10 through 14 are in use by etd_data info iovar */ 67*4882a593Smuzhiyun TAG_TRAP_PCIE_Q = 15u, /* PCIE Queue state during memory trap */ 68*4882a593Smuzhiyun TAG_TRAP_WLC_STATE = 16u, /* WLAN state during memory trap */ 69*4882a593Smuzhiyun TAG_TRAP_MAC_WAKE = 17u, /* Mac level wake issues */ 70*4882a593Smuzhiyun TAG_TRAP_PHYTXERR_THRESH = 18u, /* Phy Tx Err */ 71*4882a593Smuzhiyun TAG_TRAP_HC_DATA = 19u, /* Data collected by HC module */ 72*4882a593Smuzhiyun TAG_TRAP_LOG_DATA = 20u, 73*4882a593Smuzhiyun TAG_TRAP_CODE = 21u, /* The trap type */ 74*4882a593Smuzhiyun TAG_TRAP_HMAP = 22u, /* HMAP violation Address and Info */ 75*4882a593Smuzhiyun TAG_TRAP_PCIE_ERR_ATTN = 23u, /* PCIE error attn log */ 76*4882a593Smuzhiyun TAG_TRAP_AXI_ERROR = 24u, /* AXI Error */ 77*4882a593Smuzhiyun TAG_TRAP_AXI_HOST_INFO = 25u, /* AXI Host log */ 78*4882a593Smuzhiyun TAG_TRAP_AXI_SR_ERROR = 26u, /* AXI SR error log */ 79*4882a593Smuzhiyun TAG_TRAP_MEM_BIT_FLIP = 27u, /* Memory 1-Bit Flip error */ 80*4882a593Smuzhiyun TAG_TRAP_LAST /* This must be the last entry */ 81*4882a593Smuzhiyun } hnd_ext_tag_trap_t; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun typedef struct hnd_ext_trap_bp_err 84*4882a593Smuzhiyun { 85*4882a593Smuzhiyun uint32 error; 86*4882a593Smuzhiyun uint32 coreid; 87*4882a593Smuzhiyun uint32 baseaddr; 88*4882a593Smuzhiyun uint32 ioctrl; 89*4882a593Smuzhiyun uint32 iostatus; 90*4882a593Smuzhiyun uint32 resetctrl; 91*4882a593Smuzhiyun uint32 resetstatus; 92*4882a593Smuzhiyun uint32 resetreadid; 93*4882a593Smuzhiyun uint32 resetwriteid; 94*4882a593Smuzhiyun uint32 errlogctrl; 95*4882a593Smuzhiyun uint32 errlogdone; 96*4882a593Smuzhiyun uint32 errlogstatus; 97*4882a593Smuzhiyun uint32 errlogaddrlo; 98*4882a593Smuzhiyun uint32 errlogaddrhi; 99*4882a593Smuzhiyun uint32 errlogid; 100*4882a593Smuzhiyun uint32 errloguser; 101*4882a593Smuzhiyun uint32 errlogflags; 102*4882a593Smuzhiyun uint32 itipoobaout; 103*4882a593Smuzhiyun uint32 itipoobbout; 104*4882a593Smuzhiyun uint32 itipoobcout; 105*4882a593Smuzhiyun uint32 itipoobdout; 106*4882a593Smuzhiyun } hnd_ext_trap_bp_err_t; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define HND_EXT_TRAP_AXISR_INFO_VER_1 1 109*4882a593Smuzhiyun typedef struct hnd_ext_trap_axi_sr_err_v1 110*4882a593Smuzhiyun { 111*4882a593Smuzhiyun uint8 version; 112*4882a593Smuzhiyun uint8 pad[3]; 113*4882a593Smuzhiyun uint32 error; 114*4882a593Smuzhiyun uint32 coreid; 115*4882a593Smuzhiyun uint32 baseaddr; 116*4882a593Smuzhiyun uint32 ioctrl; 117*4882a593Smuzhiyun uint32 iostatus; 118*4882a593Smuzhiyun uint32 resetctrl; 119*4882a593Smuzhiyun uint32 resetstatus; 120*4882a593Smuzhiyun uint32 resetreadid; 121*4882a593Smuzhiyun uint32 resetwriteid; 122*4882a593Smuzhiyun uint32 errlogctrl; 123*4882a593Smuzhiyun uint32 errlogdone; 124*4882a593Smuzhiyun uint32 errlogstatus; 125*4882a593Smuzhiyun uint32 errlogaddrlo; 126*4882a593Smuzhiyun uint32 errlogaddrhi; 127*4882a593Smuzhiyun uint32 errlogid; 128*4882a593Smuzhiyun uint32 errloguser; 129*4882a593Smuzhiyun uint32 errlogflags; 130*4882a593Smuzhiyun uint32 itipoobaout; 131*4882a593Smuzhiyun uint32 itipoobbout; 132*4882a593Smuzhiyun uint32 itipoobcout; 133*4882a593Smuzhiyun uint32 itipoobdout; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* axi_sr_issue_debug */ 136*4882a593Smuzhiyun uint32 sr_pwr_control; 137*4882a593Smuzhiyun uint32 sr_corereset_wrapper_main; 138*4882a593Smuzhiyun uint32 sr_corereset_wrapper_aux; 139*4882a593Smuzhiyun uint32 sr_main_gci_status_0; 140*4882a593Smuzhiyun uint32 sr_aux_gci_status_0; 141*4882a593Smuzhiyun uint32 sr_dig_gci_status_0; 142*4882a593Smuzhiyun } hnd_ext_trap_axi_sr_err_v1_t; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #define HND_EXT_TRAP_PSMWD_INFO_VER 1 145*4882a593Smuzhiyun typedef struct hnd_ext_trap_psmwd_v1 { 146*4882a593Smuzhiyun uint16 xtag; 147*4882a593Smuzhiyun uint16 version; /* version of the information following this */ 148*4882a593Smuzhiyun uint32 i32_maccontrol; 149*4882a593Smuzhiyun uint32 i32_maccommand; 150*4882a593Smuzhiyun uint32 i32_macintstatus; 151*4882a593Smuzhiyun uint32 i32_phydebug; 152*4882a593Smuzhiyun uint32 i32_clk_ctl_st; 153*4882a593Smuzhiyun uint32 i32_psmdebug[PSMDBG_REG_READ_CNT_FOR_PSMWDTRAP_V1]; 154*4882a593Smuzhiyun uint16 i16_0x1a8; /* gated clock en */ 155*4882a593Smuzhiyun uint16 i16_0x406; /* Rcv Fifo Ctrl */ 156*4882a593Smuzhiyun uint16 i16_0x408; /* Rx ctrl 1 */ 157*4882a593Smuzhiyun uint16 i16_0x41a; /* Rxe Status 1 */ 158*4882a593Smuzhiyun uint16 i16_0x41c; /* Rxe Status 2 */ 159*4882a593Smuzhiyun uint16 i16_0x424; /* rcv wrd count 0 */ 160*4882a593Smuzhiyun uint16 i16_0x426; /* rcv wrd count 1 */ 161*4882a593Smuzhiyun uint16 i16_0x456; /* RCV_LFIFO_STS */ 162*4882a593Smuzhiyun uint16 i16_0x480; /* PSM_SLP_TMR */ 163*4882a593Smuzhiyun uint16 i16_0x490; /* PSM BRC */ 164*4882a593Smuzhiyun uint16 i16_0x500; /* TXE CTRL */ 165*4882a593Smuzhiyun uint16 i16_0x50e; /* TXE Status */ 166*4882a593Smuzhiyun uint16 i16_0x55e; /* TXE_xmtdmabusy */ 167*4882a593Smuzhiyun uint16 i16_0x566; /* TXE_XMTfifosuspflush */ 168*4882a593Smuzhiyun uint16 i16_0x690; /* IFS Stat */ 169*4882a593Smuzhiyun uint16 i16_0x692; /* IFS_MEDBUSY_CTR */ 170*4882a593Smuzhiyun uint16 i16_0x694; /* IFS_TX_DUR */ 171*4882a593Smuzhiyun uint16 i16_0x6a0; /* SLow_CTL */ 172*4882a593Smuzhiyun uint16 i16_0x838; /* TXE_AQM fifo Ready */ 173*4882a593Smuzhiyun uint16 i16_0x8c0; /* Dagg ctrl */ 174*4882a593Smuzhiyun uint16 shm_prewds_cnt; 175*4882a593Smuzhiyun uint16 shm_txtplufl_cnt; 176*4882a593Smuzhiyun uint16 shm_txphyerr_cnt; 177*4882a593Smuzhiyun uint16 pad; 178*4882a593Smuzhiyun } hnd_ext_trap_psmwd_v1_t; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun typedef struct hnd_ext_trap_psmwd { 181*4882a593Smuzhiyun uint16 xtag; 182*4882a593Smuzhiyun uint16 version; /* version of the information following this */ 183*4882a593Smuzhiyun uint32 i32_maccontrol; 184*4882a593Smuzhiyun uint32 i32_maccommand; 185*4882a593Smuzhiyun uint32 i32_macintstatus; 186*4882a593Smuzhiyun uint32 i32_phydebug; 187*4882a593Smuzhiyun uint32 i32_clk_ctl_st; 188*4882a593Smuzhiyun uint32 i32_psmdebug[PSMDBG_REG_READ_CNT_FOR_PSMWDTRAP_V2]; 189*4882a593Smuzhiyun uint16 i16_0x4b8; /* psm_brwk_0 */ 190*4882a593Smuzhiyun uint16 i16_0x4ba; /* psm_brwk_1 */ 191*4882a593Smuzhiyun uint16 i16_0x4bc; /* psm_brwk_2 */ 192*4882a593Smuzhiyun uint16 i16_0x4be; /* psm_brwk_2 */ 193*4882a593Smuzhiyun uint16 i16_0x1a8; /* gated clock en */ 194*4882a593Smuzhiyun uint16 i16_0x406; /* Rcv Fifo Ctrl */ 195*4882a593Smuzhiyun uint16 i16_0x408; /* Rx ctrl 1 */ 196*4882a593Smuzhiyun uint16 i16_0x41a; /* Rxe Status 1 */ 197*4882a593Smuzhiyun uint16 i16_0x41c; /* Rxe Status 2 */ 198*4882a593Smuzhiyun uint16 i16_0x424; /* rcv wrd count 0 */ 199*4882a593Smuzhiyun uint16 i16_0x426; /* rcv wrd count 1 */ 200*4882a593Smuzhiyun uint16 i16_0x456; /* RCV_LFIFO_STS */ 201*4882a593Smuzhiyun uint16 i16_0x480; /* PSM_SLP_TMR */ 202*4882a593Smuzhiyun uint16 i16_0x500; /* TXE CTRL */ 203*4882a593Smuzhiyun uint16 i16_0x50e; /* TXE Status */ 204*4882a593Smuzhiyun uint16 i16_0x55e; /* TXE_xmtdmabusy */ 205*4882a593Smuzhiyun uint16 i16_0x566; /* TXE_XMTfifosuspflush */ 206*4882a593Smuzhiyun uint16 i16_0x690; /* IFS Stat */ 207*4882a593Smuzhiyun uint16 i16_0x692; /* IFS_MEDBUSY_CTR */ 208*4882a593Smuzhiyun uint16 i16_0x694; /* IFS_TX_DUR */ 209*4882a593Smuzhiyun uint16 i16_0x6a0; /* SLow_CTL */ 210*4882a593Smuzhiyun uint16 i16_0x490; /* psm_brc */ 211*4882a593Smuzhiyun uint16 i16_0x4da; /* psm_brc_1 */ 212*4882a593Smuzhiyun uint16 i16_0x838; /* TXE_AQM fifo Ready */ 213*4882a593Smuzhiyun uint16 i16_0x8c0; /* Dagg ctrl */ 214*4882a593Smuzhiyun uint16 shm_prewds_cnt; 215*4882a593Smuzhiyun uint16 shm_txtplufl_cnt; 216*4882a593Smuzhiyun uint16 shm_txphyerr_cnt; 217*4882a593Smuzhiyun } hnd_ext_trap_psmwd_t; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun #define HEAP_HISTOGRAM_DUMP_LEN 6 220*4882a593Smuzhiyun #define HEAP_MAX_SZ_BLKS_LEN 2 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* Ignore chunks for which there are fewer than this many instances, irrespective of size */ 223*4882a593Smuzhiyun #define HEAP_HISTOGRAM_INSTANCE_MIN 4 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* 226*4882a593Smuzhiyun * Use the last two length values for chunks larger than this, or when we run out of 227*4882a593Smuzhiyun * histogram entries (because we have too many different sized chunks) to store "other" 228*4882a593Smuzhiyun */ 229*4882a593Smuzhiyun #define HEAP_HISTOGRAM_SPECIAL 0xfffeu 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun #define HEAP_HISTOGRAM_GRTR256K 0xffffu 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun typedef struct hnd_ext_trap_heap_err { 234*4882a593Smuzhiyun uint32 arena_total; 235*4882a593Smuzhiyun uint32 heap_free; 236*4882a593Smuzhiyun uint32 heap_inuse; 237*4882a593Smuzhiyun uint32 mf_count; 238*4882a593Smuzhiyun uint32 stack_lwm; 239*4882a593Smuzhiyun uint16 heap_histogm[HEAP_HISTOGRAM_DUMP_LEN * 2]; /* size/number */ 240*4882a593Smuzhiyun uint16 max_sz_free_blk[HEAP_MAX_SZ_BLKS_LEN]; 241*4882a593Smuzhiyun } hnd_ext_trap_heap_err_t; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun #define MEM_TRAP_NUM_WLC_TX_QUEUES 6 244*4882a593Smuzhiyun #define HND_EXT_TRAP_WLC_MEM_ERR_VER_V2 2 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* already there are quite a few chips which are ROM'ed wth this structure 247*4882a593Smuzhiyun * Will not be adding version. This will be the V1 structure. 248*4882a593Smuzhiyun */ 249*4882a593Smuzhiyun typedef struct hnd_ext_trap_wlc_mem_err { 250*4882a593Smuzhiyun uint8 instance; 251*4882a593Smuzhiyun uint8 associated; 252*4882a593Smuzhiyun uint8 soft_ap_client_cnt; 253*4882a593Smuzhiyun uint8 peer_cnt; 254*4882a593Smuzhiyun uint16 txqueue_len[MEM_TRAP_NUM_WLC_TX_QUEUES]; 255*4882a593Smuzhiyun } hnd_ext_trap_wlc_mem_err_t; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun typedef struct hnd_ext_trap_wlc_mem_err_v2 { 258*4882a593Smuzhiyun uint16 version; 259*4882a593Smuzhiyun uint16 pad; 260*4882a593Smuzhiyun uint8 instance; 261*4882a593Smuzhiyun uint8 stas_associated; 262*4882a593Smuzhiyun uint8 aps_associated; 263*4882a593Smuzhiyun uint8 soft_ap_client_cnt; 264*4882a593Smuzhiyun uint16 txqueue_len[MEM_TRAP_NUM_WLC_TX_QUEUES]; 265*4882a593Smuzhiyun } hnd_ext_trap_wlc_mem_err_v2_t; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define HND_EXT_TRAP_WLC_MEM_ERR_VER_V3 3 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun typedef struct hnd_ext_trap_wlc_mem_err_v3 { 270*4882a593Smuzhiyun uint8 version; 271*4882a593Smuzhiyun uint8 instance; 272*4882a593Smuzhiyun uint8 stas_associated; 273*4882a593Smuzhiyun uint8 aps_associated; 274*4882a593Smuzhiyun uint8 soft_ap_client_cnt; 275*4882a593Smuzhiyun uint8 peer_cnt; 276*4882a593Smuzhiyun uint16 txqueue_len[MEM_TRAP_NUM_WLC_TX_QUEUES]; 277*4882a593Smuzhiyun } hnd_ext_trap_wlc_mem_err_v3_t; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun typedef struct hnd_ext_trap_pcie_mem_err { 280*4882a593Smuzhiyun uint16 d2h_queue_len; 281*4882a593Smuzhiyun uint16 d2h_req_queue_len; 282*4882a593Smuzhiyun } hnd_ext_trap_pcie_mem_err_t; 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun #define MAX_DMAFIFO_ENTRIES_V1 1 285*4882a593Smuzhiyun #define MAX_DMAFIFO_DESC_ENTRIES_V1 2 286*4882a593Smuzhiyun #define HND_EXT_TRAP_AXIERROR_SIGNATURE 0xbabebabe 287*4882a593Smuzhiyun #define HND_EXT_TRAP_AXIERROR_VERSION_1 1 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* Structure to collect debug info of descriptor entry for dma channel on encountering AXI Error */ 290*4882a593Smuzhiyun /* Below three structures are dependant, any change will bump version of all the three */ 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun typedef struct hnd_ext_trap_desc_entry_v1 { 293*4882a593Smuzhiyun uint32 ctrl1; /* descriptor entry at din < misc control bits > */ 294*4882a593Smuzhiyun uint32 ctrl2; /* descriptor entry at din <buffer count and address extension> */ 295*4882a593Smuzhiyun uint32 addrlo; /* descriptor entry at din <address of data buffer, bits 31:0> */ 296*4882a593Smuzhiyun uint32 addrhi; /* descriptor entry at din <address of data buffer, bits 63:32> */ 297*4882a593Smuzhiyun } dma_dentry_v1_t; 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun /* Structure to collect debug info about a dma channel on encountering AXI Error */ 300*4882a593Smuzhiyun typedef struct hnd_ext_trap_dma_fifo_v1 { 301*4882a593Smuzhiyun uint8 valid; /* no of valid desc entries filled, non zero = fifo entry valid */ 302*4882a593Smuzhiyun uint8 direction; /* TX=1, RX=2, currently only using TX */ 303*4882a593Smuzhiyun uint16 index; /* Index of the DMA channel in system */ 304*4882a593Smuzhiyun uint32 dpa; /* Expected Address of Descriptor table from software state */ 305*4882a593Smuzhiyun uint32 desc_lo; /* Low Address of Descriptor table programmed in DMA register */ 306*4882a593Smuzhiyun uint32 desc_hi; /* High Address of Descriptor table programmed in DMA register */ 307*4882a593Smuzhiyun uint16 din; /* rxin / txin */ 308*4882a593Smuzhiyun uint16 dout; /* rxout / txout */ 309*4882a593Smuzhiyun dma_dentry_v1_t dentry[MAX_DMAFIFO_DESC_ENTRIES_V1]; /* Descriptor Entires */ 310*4882a593Smuzhiyun } dma_fifo_v1_t; 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun typedef struct hnd_ext_trap_axi_error_v1 { 313*4882a593Smuzhiyun uint8 version; /* version = 1 */ 314*4882a593Smuzhiyun uint8 dma_fifo_valid_count; /* Number of valid dma_fifo entries */ 315*4882a593Smuzhiyun uint16 length; /* length of whole structure */ 316*4882a593Smuzhiyun uint32 signature; /* indicate that its filled with AXI Error data */ 317*4882a593Smuzhiyun uint32 axi_errorlog_status; /* errlog_status from slave wrapper */ 318*4882a593Smuzhiyun uint32 axi_errorlog_core; /* errlog_core from slave wrapper */ 319*4882a593Smuzhiyun uint32 axi_errorlog_lo; /* errlog_lo from slave wrapper */ 320*4882a593Smuzhiyun uint32 axi_errorlog_hi; /* errlog_hi from slave wrapper */ 321*4882a593Smuzhiyun uint32 axi_errorlog_id; /* errlog_id from slave wrapper */ 322*4882a593Smuzhiyun dma_fifo_v1_t dma_fifo[MAX_DMAFIFO_ENTRIES_V1]; 323*4882a593Smuzhiyun } hnd_ext_trap_axi_error_v1_t; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun #define HND_EXT_TRAP_MACSUSP_INFO_VER 1 326*4882a593Smuzhiyun typedef struct hnd_ext_trap_macsusp { 327*4882a593Smuzhiyun uint16 xtag; 328*4882a593Smuzhiyun uint8 version; /* version of the information following this */ 329*4882a593Smuzhiyun uint8 trap_reason; 330*4882a593Smuzhiyun uint32 i32_maccontrol; 331*4882a593Smuzhiyun uint32 i32_maccommand; 332*4882a593Smuzhiyun uint32 i32_macintstatus; 333*4882a593Smuzhiyun uint32 i32_phydebug[4]; 334*4882a593Smuzhiyun uint32 i32_psmdebug[8]; 335*4882a593Smuzhiyun uint16 i16_0x41a; /* Rxe Status 1 */ 336*4882a593Smuzhiyun uint16 i16_0x41c; /* Rxe Status 2 */ 337*4882a593Smuzhiyun uint16 i16_0x490; /* PSM BRC */ 338*4882a593Smuzhiyun uint16 i16_0x50e; /* TXE Status */ 339*4882a593Smuzhiyun uint16 i16_0x55e; /* TXE_xmtdmabusy */ 340*4882a593Smuzhiyun uint16 i16_0x566; /* TXE_XMTfifosuspflush */ 341*4882a593Smuzhiyun uint16 i16_0x690; /* IFS Stat */ 342*4882a593Smuzhiyun uint16 i16_0x692; /* IFS_MEDBUSY_CTR */ 343*4882a593Smuzhiyun uint16 i16_0x694; /* IFS_TX_DUR */ 344*4882a593Smuzhiyun uint16 i16_0x7c0; /* WEP CTL */ 345*4882a593Smuzhiyun uint16 i16_0x838; /* TXE_AQM fifo Ready */ 346*4882a593Smuzhiyun uint16 i16_0x880; /* MHP_status */ 347*4882a593Smuzhiyun uint16 shm_prewds_cnt; 348*4882a593Smuzhiyun uint16 shm_ucode_dbgst; 349*4882a593Smuzhiyun } hnd_ext_trap_macsusp_t; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun #define HND_EXT_TRAP_MACENAB_INFO_VER 1 352*4882a593Smuzhiyun typedef struct hnd_ext_trap_macenab { 353*4882a593Smuzhiyun uint16 xtag; 354*4882a593Smuzhiyun uint8 version; /* version of the information following this */ 355*4882a593Smuzhiyun uint8 trap_reason; 356*4882a593Smuzhiyun uint32 i32_maccontrol; 357*4882a593Smuzhiyun uint32 i32_maccommand; 358*4882a593Smuzhiyun uint32 i32_macintstatus; 359*4882a593Smuzhiyun uint32 i32_psmdebug[8]; 360*4882a593Smuzhiyun uint32 i32_clk_ctl_st; 361*4882a593Smuzhiyun uint32 i32_powerctl; 362*4882a593Smuzhiyun uint16 i16_0x1a8; /* gated clock en */ 363*4882a593Smuzhiyun uint16 i16_0x480; /* PSM_SLP_TMR */ 364*4882a593Smuzhiyun uint16 i16_0x490; /* PSM BRC */ 365*4882a593Smuzhiyun uint16 i16_0x600; /* TSF CTL */ 366*4882a593Smuzhiyun uint16 i16_0x690; /* IFS Stat */ 367*4882a593Smuzhiyun uint16 i16_0x692; /* IFS_MEDBUSY_CTR */ 368*4882a593Smuzhiyun uint16 i16_0x6a0; /* SLow_CTL */ 369*4882a593Smuzhiyun uint16 i16_0x6a6; /* SLow_FRAC */ 370*4882a593Smuzhiyun uint16 i16_0x6a8; /* fast power up delay */ 371*4882a593Smuzhiyun uint16 i16_0x6aa; /* SLow_PER */ 372*4882a593Smuzhiyun uint16 shm_ucode_dbgst; 373*4882a593Smuzhiyun uint16 PAD; 374*4882a593Smuzhiyun } hnd_ext_trap_macenab_t; 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun #define HND_EXT_TRAP_PHY_INFO_VER_1 (1) 377*4882a593Smuzhiyun typedef struct hnd_ext_trap_phydbg { 378*4882a593Smuzhiyun uint16 err; 379*4882a593Smuzhiyun uint16 RxFeStatus; 380*4882a593Smuzhiyun uint16 TxFIFOStatus0; 381*4882a593Smuzhiyun uint16 TxFIFOStatus1; 382*4882a593Smuzhiyun uint16 RfseqMode; 383*4882a593Smuzhiyun uint16 RfseqStatus0; 384*4882a593Smuzhiyun uint16 RfseqStatus1; 385*4882a593Smuzhiyun uint16 RfseqStatus_Ocl; 386*4882a593Smuzhiyun uint16 RfseqStatus_Ocl1; 387*4882a593Smuzhiyun uint16 OCLControl1; 388*4882a593Smuzhiyun uint16 TxError; 389*4882a593Smuzhiyun uint16 bphyTxError; 390*4882a593Smuzhiyun uint16 TxCCKError; 391*4882a593Smuzhiyun uint16 TxCtrlWrd0; 392*4882a593Smuzhiyun uint16 TxCtrlWrd1; 393*4882a593Smuzhiyun uint16 TxCtrlWrd2; 394*4882a593Smuzhiyun uint16 TxLsig0; 395*4882a593Smuzhiyun uint16 TxLsig1; 396*4882a593Smuzhiyun uint16 TxVhtSigA10; 397*4882a593Smuzhiyun uint16 TxVhtSigA11; 398*4882a593Smuzhiyun uint16 TxVhtSigA20; 399*4882a593Smuzhiyun uint16 TxVhtSigA21; 400*4882a593Smuzhiyun uint16 txPktLength; 401*4882a593Smuzhiyun uint16 txPsdulengthCtr; 402*4882a593Smuzhiyun uint16 gpioClkControl; 403*4882a593Smuzhiyun uint16 gpioSel; 404*4882a593Smuzhiyun uint16 pktprocdebug; 405*4882a593Smuzhiyun uint16 PAD; 406*4882a593Smuzhiyun uint32 gpioOut[3]; 407*4882a593Smuzhiyun } hnd_ext_trap_phydbg_t; 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /* unique IDs for separate cores in SI */ 410*4882a593Smuzhiyun #define REGDUMP_MASK_MAC0 BCM_BIT(1) 411*4882a593Smuzhiyun #define REGDUMP_MASK_ARM BCM_BIT(2) 412*4882a593Smuzhiyun #define REGDUMP_MASK_PCIE BCM_BIT(3) 413*4882a593Smuzhiyun #define REGDUMP_MASK_MAC1 BCM_BIT(4) 414*4882a593Smuzhiyun #define REGDUMP_MASK_PMU BCM_BIT(5) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun typedef struct { 417*4882a593Smuzhiyun uint16 reg_offset; 418*4882a593Smuzhiyun uint16 core_mask; 419*4882a593Smuzhiyun } reg_dump_config_t; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun #define HND_EXT_TRAP_PHY_INFO_VER 2 422*4882a593Smuzhiyun typedef struct hnd_ext_trap_phydbg_v2 { 423*4882a593Smuzhiyun uint8 version; 424*4882a593Smuzhiyun uint8 len; 425*4882a593Smuzhiyun uint16 err; 426*4882a593Smuzhiyun uint16 RxFeStatus; 427*4882a593Smuzhiyun uint16 TxFIFOStatus0; 428*4882a593Smuzhiyun uint16 TxFIFOStatus1; 429*4882a593Smuzhiyun uint16 RfseqMode; 430*4882a593Smuzhiyun uint16 RfseqStatus0; 431*4882a593Smuzhiyun uint16 RfseqStatus1; 432*4882a593Smuzhiyun uint16 RfseqStatus_Ocl; 433*4882a593Smuzhiyun uint16 RfseqStatus_Ocl1; 434*4882a593Smuzhiyun uint16 OCLControl1; 435*4882a593Smuzhiyun uint16 TxError; 436*4882a593Smuzhiyun uint16 bphyTxError; 437*4882a593Smuzhiyun uint16 TxCCKError; 438*4882a593Smuzhiyun uint16 TxCtrlWrd0; 439*4882a593Smuzhiyun uint16 TxCtrlWrd1; 440*4882a593Smuzhiyun uint16 TxCtrlWrd2; 441*4882a593Smuzhiyun uint16 TxLsig0; 442*4882a593Smuzhiyun uint16 TxLsig1; 443*4882a593Smuzhiyun uint16 TxVhtSigA10; 444*4882a593Smuzhiyun uint16 TxVhtSigA11; 445*4882a593Smuzhiyun uint16 TxVhtSigA20; 446*4882a593Smuzhiyun uint16 TxVhtSigA21; 447*4882a593Smuzhiyun uint16 txPktLength; 448*4882a593Smuzhiyun uint16 txPsdulengthCtr; 449*4882a593Smuzhiyun uint16 gpioClkControl; 450*4882a593Smuzhiyun uint16 gpioSel; 451*4882a593Smuzhiyun uint16 pktprocdebug; 452*4882a593Smuzhiyun uint32 gpioOut[3]; 453*4882a593Smuzhiyun uint32 additional_regs[1]; 454*4882a593Smuzhiyun } hnd_ext_trap_phydbg_v2_t; 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun #define HND_EXT_TRAP_PHY_INFO_VER_3 (3) 457*4882a593Smuzhiyun typedef struct hnd_ext_trap_phydbg_v3 { 458*4882a593Smuzhiyun uint8 version; 459*4882a593Smuzhiyun uint8 len; 460*4882a593Smuzhiyun uint16 err; 461*4882a593Smuzhiyun uint16 RxFeStatus; 462*4882a593Smuzhiyun uint16 TxFIFOStatus0; 463*4882a593Smuzhiyun uint16 TxFIFOStatus1; 464*4882a593Smuzhiyun uint16 RfseqMode; 465*4882a593Smuzhiyun uint16 RfseqStatus0; 466*4882a593Smuzhiyun uint16 RfseqStatus1; 467*4882a593Smuzhiyun uint16 RfseqStatus_Ocl; 468*4882a593Smuzhiyun uint16 RfseqStatus_Ocl1; 469*4882a593Smuzhiyun uint16 OCLControl1; 470*4882a593Smuzhiyun uint16 TxError; 471*4882a593Smuzhiyun uint16 bphyTxError; 472*4882a593Smuzhiyun uint16 TxCCKError; 473*4882a593Smuzhiyun uint16 TxCtrlWrd0; 474*4882a593Smuzhiyun uint16 TxCtrlWrd1; 475*4882a593Smuzhiyun uint16 TxCtrlWrd2; 476*4882a593Smuzhiyun uint16 TxLsig0; 477*4882a593Smuzhiyun uint16 TxLsig1; 478*4882a593Smuzhiyun uint16 TxVhtSigA10; 479*4882a593Smuzhiyun uint16 TxVhtSigA11; 480*4882a593Smuzhiyun uint16 TxVhtSigA20; 481*4882a593Smuzhiyun uint16 TxVhtSigA21; 482*4882a593Smuzhiyun uint16 txPktLength; 483*4882a593Smuzhiyun uint16 txPsdulengthCtr; 484*4882a593Smuzhiyun uint16 gpioClkControl; 485*4882a593Smuzhiyun uint16 gpioSel; 486*4882a593Smuzhiyun uint16 pktprocdebug; 487*4882a593Smuzhiyun uint32 gpioOut[3]; 488*4882a593Smuzhiyun uint16 HESigURateFlagStatus; 489*4882a593Smuzhiyun uint16 HESigUsRateFlagStatus; 490*4882a593Smuzhiyun uint32 additional_regs[1]; 491*4882a593Smuzhiyun } hnd_ext_trap_phydbg_v3_t; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* Phy TxErr Dump Structure */ 494*4882a593Smuzhiyun #define HND_EXT_TRAP_PHYTXERR_INFO_VER 1 495*4882a593Smuzhiyun #define HND_EXT_TRAP_PHYTXERR_INFO_VER_V2 2 496*4882a593Smuzhiyun typedef struct hnd_ext_trap_macphytxerr { 497*4882a593Smuzhiyun uint8 version; /* version of the information following this */ 498*4882a593Smuzhiyun uint8 trap_reason; 499*4882a593Smuzhiyun uint16 i16_0x63E; /* tsf_tmr_rx_ts */ 500*4882a593Smuzhiyun uint16 i16_0x640; /* tsf_tmr_tx_ts */ 501*4882a593Smuzhiyun uint16 i16_0x642; /* tsf_tmr_rx_end_ts */ 502*4882a593Smuzhiyun uint16 i16_0x846; /* TDC_FrmLen0 */ 503*4882a593Smuzhiyun uint16 i16_0x848; /* TDC_FrmLen1 */ 504*4882a593Smuzhiyun uint16 i16_0x84a; /* TDC_Txtime */ 505*4882a593Smuzhiyun uint16 i16_0xa5a; /* TXE_BytCntInTxFrmLo */ 506*4882a593Smuzhiyun uint16 i16_0xa5c; /* TXE_BytCntInTxFrmHi */ 507*4882a593Smuzhiyun uint16 i16_0x856; /* TDC_VhtPsduLen0 */ 508*4882a593Smuzhiyun uint16 i16_0x858; /* TDC_VhtPsduLen1 */ 509*4882a593Smuzhiyun uint16 i16_0x490; /* psm_brc */ 510*4882a593Smuzhiyun uint16 i16_0x4d8; /* psm_brc_1 */ 511*4882a593Smuzhiyun uint16 shm_txerr_reason; 512*4882a593Smuzhiyun uint16 shm_pctl0; 513*4882a593Smuzhiyun uint16 shm_pctl1; 514*4882a593Smuzhiyun uint16 shm_pctl2; 515*4882a593Smuzhiyun uint16 shm_lsig0; 516*4882a593Smuzhiyun uint16 shm_lsig1; 517*4882a593Smuzhiyun uint16 shm_plcp0; 518*4882a593Smuzhiyun uint16 shm_plcp1; 519*4882a593Smuzhiyun uint16 shm_plcp2; 520*4882a593Smuzhiyun uint16 shm_vht_sigb0; 521*4882a593Smuzhiyun uint16 shm_vht_sigb1; 522*4882a593Smuzhiyun uint16 shm_tx_tst; 523*4882a593Smuzhiyun uint16 shm_txerr_tm; 524*4882a593Smuzhiyun uint16 shm_curchannel; 525*4882a593Smuzhiyun uint16 shm_crx_rxtsf_pos; 526*4882a593Smuzhiyun uint16 shm_lasttx_tsf; 527*4882a593Smuzhiyun uint16 shm_s_rxtsftmrval; 528*4882a593Smuzhiyun uint16 i16_0x29; /* Phy indirect address */ 529*4882a593Smuzhiyun uint16 i16_0x2a; /* Phy indirect address */ 530*4882a593Smuzhiyun } hnd_ext_trap_macphytxerr_t; 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun typedef struct hnd_ext_trap_macphytxerr_v2 { 533*4882a593Smuzhiyun uint8 version; /* version of the information following this */ 534*4882a593Smuzhiyun uint8 trap_reason; 535*4882a593Smuzhiyun uint16 i16_0x63E; /* tsf_tmr_rx_ts */ 536*4882a593Smuzhiyun uint16 i16_0x640; /* tsf_tmr_tx_ts */ 537*4882a593Smuzhiyun uint16 i16_0x642; /* tsf_tmr_rx_end_ts */ 538*4882a593Smuzhiyun uint16 i16_0x846; /* TDC_FrmLen0 */ 539*4882a593Smuzhiyun uint16 i16_0x848; /* TDC_FrmLen1 */ 540*4882a593Smuzhiyun uint16 i16_0x84a; /* TDC_Txtime */ 541*4882a593Smuzhiyun uint16 i16_0xa5a; /* TXE_BytCntInTxFrmLo */ 542*4882a593Smuzhiyun uint16 i16_0xa5c; /* TXE_BytCntInTxFrmHi */ 543*4882a593Smuzhiyun uint16 i16_0x856; /* TDC_VhtPsduLen0 */ 544*4882a593Smuzhiyun uint16 i16_0x858; /* TDC_VhtPsduLen1 */ 545*4882a593Smuzhiyun uint16 i16_0x490; /* psm_brc */ 546*4882a593Smuzhiyun uint16 i16_0x4d8; /* psm_brc_1 */ 547*4882a593Smuzhiyun uint16 shm_txerr_reason; 548*4882a593Smuzhiyun uint16 shm_pctl0; 549*4882a593Smuzhiyun uint16 shm_pctl1; 550*4882a593Smuzhiyun uint16 shm_pctl2; 551*4882a593Smuzhiyun uint16 shm_lsig0; 552*4882a593Smuzhiyun uint16 shm_lsig1; 553*4882a593Smuzhiyun uint16 shm_plcp0; 554*4882a593Smuzhiyun uint16 shm_plcp1; 555*4882a593Smuzhiyun uint16 shm_plcp2; 556*4882a593Smuzhiyun uint16 shm_vht_sigb0; 557*4882a593Smuzhiyun uint16 shm_vht_sigb1; 558*4882a593Smuzhiyun uint16 shm_tx_tst; 559*4882a593Smuzhiyun uint16 shm_txerr_tm; 560*4882a593Smuzhiyun uint16 shm_curchannel; 561*4882a593Smuzhiyun uint16 shm_crx_rxtsf_pos; 562*4882a593Smuzhiyun uint16 shm_lasttx_tsf; 563*4882a593Smuzhiyun uint16 shm_s_rxtsftmrval; 564*4882a593Smuzhiyun uint16 i16_0x29; /* Phy indirect address */ 565*4882a593Smuzhiyun uint16 i16_0x2a; /* Phy indirect address */ 566*4882a593Smuzhiyun uint8 phyerr_bmac_cnt; /* number of times bmac raised phy tx err */ 567*4882a593Smuzhiyun uint8 phyerr_bmac_rsn; /* bmac reason for phy tx error */ 568*4882a593Smuzhiyun uint16 pad; 569*4882a593Smuzhiyun uint32 recv_fifo_status[3][2]; /* Rcv Status0 & Rcv Status1 for 3 Rx fifos */ 570*4882a593Smuzhiyun } hnd_ext_trap_macphytxerr_v2_t; 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun #define HND_EXT_TRAP_PCIE_ERR_ATTN_VER_1 (1u) 573*4882a593Smuzhiyun #define MAX_AER_HDR_LOG_REGS (4u) 574*4882a593Smuzhiyun typedef struct hnd_ext_trap_pcie_err_attn_v1 { 575*4882a593Smuzhiyun uint8 version; 576*4882a593Smuzhiyun uint8 pad[3]; 577*4882a593Smuzhiyun uint32 err_hdr_logreg1; 578*4882a593Smuzhiyun uint32 err_hdr_logreg2; 579*4882a593Smuzhiyun uint32 err_hdr_logreg3; 580*4882a593Smuzhiyun uint32 err_hdr_logreg4; 581*4882a593Smuzhiyun uint32 err_code_logreg; 582*4882a593Smuzhiyun uint32 err_type; 583*4882a593Smuzhiyun uint32 err_code_state; 584*4882a593Smuzhiyun uint32 last_err_attn_ts; 585*4882a593Smuzhiyun uint32 cfg_tlp_hdr[MAX_AER_HDR_LOG_REGS]; 586*4882a593Smuzhiyun } hnd_ext_trap_pcie_err_attn_v1_t; 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun #define MAX_EVENTLOG_BUFFERS 48 589*4882a593Smuzhiyun typedef struct eventlog_trapdata_info { 590*4882a593Smuzhiyun uint32 num_elements; 591*4882a593Smuzhiyun uint32 seq_num; 592*4882a593Smuzhiyun uint32 log_arr_addr; 593*4882a593Smuzhiyun } eventlog_trapdata_info_t; 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun typedef struct eventlog_trap_buf_info { 596*4882a593Smuzhiyun uint32 len; 597*4882a593Smuzhiyun uint32 buf_addr; 598*4882a593Smuzhiyun } eventlog_trap_buf_info_t; 599*4882a593Smuzhiyun 600*4882a593Smuzhiyun #define HND_MEM_HC_FB_MEM_VER_1 (1u) 601*4882a593Smuzhiyun typedef struct hnd_ext_trap_fb_mem_err { 602*4882a593Smuzhiyun uint16 version; 603*4882a593Smuzhiyun uint16 reserved; 604*4882a593Smuzhiyun uint32 flip_bit_err_time; 605*4882a593Smuzhiyun } hnd_ext_trap_fb_mem_err_t; 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun #if defined(ETD) && !defined(WLETD) 608*4882a593Smuzhiyun #define ETD_SW_FLAG_MEM 0x00000001 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun int etd_init(osl_t *osh); 611*4882a593Smuzhiyun int etd_register_trap_ext_callback(void *cb, void *arg); 612*4882a593Smuzhiyun int (etd_register_trap_ext_callback_late)(void *cb, void *arg); 613*4882a593Smuzhiyun uint32 *etd_get_trap_ext_data(void); 614*4882a593Smuzhiyun uint32 etd_get_trap_ext_swflags(void); 615*4882a593Smuzhiyun void etd_set_trap_ext_swflag(uint32 flag); 616*4882a593Smuzhiyun void etd_notify_trap_ext_callback(trap_t *tr); 617*4882a593Smuzhiyun reg_dump_config_t *etd_get_reg_dump_config_tbl(void); 618*4882a593Smuzhiyun uint etd_get_reg_dump_config_len(void); 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun extern bool _etd_enab; 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun #if defined(ROM_ENAB_RUNTIME_CHECK) 623*4882a593Smuzhiyun #define ETD_ENAB(pub) (_etd_enab) 624*4882a593Smuzhiyun #elif defined(ETD_DISABLED) 625*4882a593Smuzhiyun #define ETD_ENAB(pub) (0) 626*4882a593Smuzhiyun #else 627*4882a593Smuzhiyun #define ETD_ENAB(pub) (1) 628*4882a593Smuzhiyun #endif 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun #else 631*4882a593Smuzhiyun #define ETD_ENAB(pub) (0) 632*4882a593Smuzhiyun #endif /* WLETD */ 633*4882a593Smuzhiyun 634*4882a593Smuzhiyun #endif /* !LANGUAGE_ASSEMBLY */ 635*4882a593Smuzhiyun 636*4882a593Smuzhiyun #endif /* _ETD_H_ */ 637