#ifndef HAVE_PKT_TYPES #define HAVE_PKT_TYPES /* * Byte offsets into packet */ #define MAC_DEST_OFF 0 //Destination MAC Address (6 bytes) #define MAC_SRC_OFF 6 //Source MAC Address (6 bytes) #define PKT_LEN_OFF 12 //Packet Length (2 bytes, high order first) #define HDR_OFF 14 //Header (4 words) #define PKT_TYP_OFF 15 //Packet type (1 byte) #define FRAG_NUM_OFF 16 //Packet fragment number (2 words, high order first) #define WRD_CNT_OFF 20 //Word count (13-bits) #define DATA_OFF 22 //Data offset #define MSG_OFF 22 //Message offset #define MAX_DATA_JMB 8994 //Maximum payload for Jumbo packets #define MAX_DATA_PKT 1494 //Maximum payload for Normal packets // The following macros assume a base pointer to the packet buffer /* * Header flags and Acknowledge Status in rbuf[HDR_OFF] */ #define AK_STATUS(b) (b[HDR_OFF]&0xF) #define PKT_FLAGS(b) ((b[HDR_OFF]>>4)&0xF) enum pkt_fl {SPONT = 1, FRAG = 2, NEW = 4, PRIO = 8}; union hdr_stat { unsigned char full; struct { unsigned int ackn : 4; //Acknowledge/Status field unsigned int spnt : 1; //Spontaneous packet flag unsigned int frag : 1; //Packet fragment flag unsigned int new : 1; //New packet flag (1st of a series of fragments) unsigned int prio : 1; //Priority packet flag } tg; // tag }; /* * Return Packet types in rbuf[PKT_TYP_OFF] (8-bits) */ enum pkt_t {NONE_EXP_PKT = -1, NO_DATA_PKT, LPBCK_PKT, TXNWRDS_PKT, EXFIFO_PKT, VMED08_PKT, VMED16_PKT, VMED32_PKT, VMED64_PKT, CNFG_MOD_PKT = 10, FLSH_RBK_PKT, IHD08_STAT_ID_PKT = 0XF8, IHD16_STAT_ID_PKT, IHD32_STAT_ID_PKT, INFO_PKT = 0XFD, WARN_PKT, ERR_PKT}; /* * Packet Fragment Number is 4 bytes starting at rbuf[FRAG_NUM_OFF] (32-bits) */ #define FRAG_NUM(b) (((b[FRAG_NUM_OFF ]&0xFF)<<24)| \ ((b[FRAG_NUM_OFF+1]&0xFF)<<16)| \ ((b[FRAG_NUM_OFF+2]&0xFF)<<8) | \ (b[FRAG_NUM_OFF+3]&0xFF)) /* * Word Count of data returned at rbuf[WRD_CNT_OFF] (13-bits) */ #define DAT_WRD_CNT(b) (((b[WRD_CNT_OFF]&0x1f)<<8)|(b[WRD_CNT_OFF+1]&0xff)) /* * For Error, Warning, and Info packet types, the source of the * information is given by the Source ID in rbuf[MSG_OFF]>>4 (4-bits) */ #define SOURCE_ID(b) ((b[MSG_OFF]>>4)&0xF) enum src_id {MISC = 0, VME_CTRL, VME_MSTR, VME_RDBK, VME_IH, VME_SLV, VME_ARB, EXFIFO_MOD, ETH_RCV, ETH_TRNS, JTAG_MOD, FLASH_MOD, CNFG_MOD, BTC_MOD, RST_HNDLR, STRTUP_SHTDWN}; /* * In general the Error, Warning, and Info message is given in * rbuf[DATA_OFF] and rbuf[DATA_OFF + 1] (12 bits) * However some messages have more data */ #define EXTRACT_MSG(b) (((b[MSG_OFF]&0xF)<<8)|(b[MSG_OFF+1]&0xFF)) /* * VME Control module Errors/Warnings/Information * Source ID = VME_CTRL */ // VME Control module Errors #define EXTRACT_CTRL_TT(b) (b[MSG_OFF+3]&3) //2nd Error word Transfer Type #define EXTRACT_CTRL_DSZ(b) ((b[MSG_OFF+3]>>2)&3) //2nd Error word Data Size #define EXTRACT_CTRL_WRT(b) ((b[MSG_OFF+3]>>4)&1) //2nd Error word Write/Read_Bar #define EXTRACT_CTRL_ASZ(b) ((b[MSG_OFF+3]>>5)&7) //2nd Error word Addr. Size #define EXTRACT_CTRL_DT(b) (b[MSG_OFF+2]&7) //2nd Error word Delay Type #define EXTRACT_CTRL_AT(b) ((b[MSG_OFF+2]>>3)&0x1F) //2nd Error word Access Types #define SECND_WRD(b) (((b[MSG_OFF+2]&0xFF)<<8)|(b[MSG_OFF+3]&0xFF)) //2nd Error word union ctrl_stat { // for 2nd Error word. unsigned short int full; struct { unsigned int tt : 2; //Transfer Type (2 bit field) unsigned int dsz : 2; //Data Size (2 bit field) unsigned int wrt : 1; //Write or Read (1 bit field) unsigned int asz : 3; //Address Size (3 bit field) unsigned int dt : 3; //Delay Type (3 bit field) unsigned int at : 5; //all "access type" bits (5 bit field) } tg; // tag struct { unsigned int :11; // place holder unsigned int pg : 1; //Program/Data access unsigned int sp : 1; //Supervisory/Non-Privileged access unsigned int lk : 1; // LOCK Command access unsigned int cr : 1; // Configuration ROM/ Control/Status Reg. unsigned int ud : 1; //User Defined Address Modifier } fl; // flag }; enum ctrl_err_t {CTRL_NO_ERR, CTRL_UNKN_ADDR, CTRL_UNKN_DLY, CTRL_INC_OPT, CTRL_RDER_UNITS, CTRL_RDER_CW, CTRL_RDER_ADDR, CTRL_RDER_DCNT, CTRL_RDER_DATA}; #define NCTRLERRS 9 /* * VME Master Errors/Warnings/Information * Source ID = VME_MSTR */ // VME Master Errors #define EXTRACT_MSTR_STATE(b)(b[MSG_OFF+1]&0x1F) #define EXTRACT_MSTR_ERR(b) ((b[MSG_OFF+1]>>5)&3) #define EXTRACT_MSTR_TT(b) (b[MSG_OFF+3]&3) //2nd Error word Transfer Type #define EXTRACT_MSTR_DSZ(b) ((b[MSG_OFF+3]>>2)&3) //2nd Error word Data Size #define EXTRACT_MSTR_WRT(b) ((b[MSG_OFF+3]>>4)&1) //2nd Error word Write/Read_Bar #define EXTRACT_MSTR_AM(b) (((b[MSG_OFF+2]&7)<<3)|((b[MSG_OFF+3]>>5)&7)) //2nd Error word Addr. Mod. union mstr_stat { // for 2nd Error word. unsigned short int full; struct { unsigned int tt : 2; unsigned int dsz : 2; unsigned int wrt : 1; unsigned int am : 6; unsigned int : 5; } tg; // tag }; //VME address when error occured is 3rd thru 6th word (64 bit). enum mstr_err_t {MSTR_NO_ERR, MSTR_BERR, MSTR_NT_ALWD, MSTR_BTO}; #define NMSTRERRS 4 /* * VME Readback module Errors/Warnings/Information * Source ID = VME_RDBK */ // VME Readback module Errors // VME Readback module Warnings /* * VME Interrupt Handler module Errors/Warnings/Information * Source ID = VME_IH */ // VME Interrupt Handler module Errors #define EXTRACT_IH_STATE(b) (b[MSG_OFF+1]&0xF) #define EXTRACT_IH_ERR(b) ((b[MSG_OFF+1]>>4)&3) #define EXTRACT_IH_IRQ(b) (b[MSG_OFF+3]&0x7F) //2nd Error word #define EXTRACT_IH_ADD(b) (b[MSG_OFF+2]&7) //2nd Error word enum ih_err_t {IH_NO_ERR, IH_BERR, IN_NT_ALWD, IH_BTO}; #define NIHERRS 4 // VME Interrupt Handler module Warnings #define EXTRACT_IRQ_MSK(b) (b[MSG_OFF+1]&0x7F) #define EXTRACT_IH_WRN(b) (((b[MSG_OFF]&0xF)<<1)|((b[MSG_OFF+1]>>7)&1)) enum ih_wrn_t {IH_NO_WARN, IH_IRQ_MSKD}; #define NIHWRNS 2 /* * External FIFO Errors/Warnings/Information * Source ID = EXFIFO_MOD */ // External FIFO Errors enum ff_err_t {FF_NO_ERR = 0, FF_RD_ERR = 1, FF_MT_ERR = 2, FF_RT_ERR = 4, FF_MK_ERR = 8, FF_WRT_ERR = 16}; #define NFFERRS 6 /* * Bus Traffic Controller Errors/Warnings/Information * Source ID = BTC_MOD */ // Bus Traffic Controller Errors enum btc_err_t {TC_NO_ERR = 0, TC_NO_DATA = 1, TC_NOT_EXC = 2, TC_UNK_FNC = 3}; /* * Startup/Shutdown Errors/Warnings/Information * Source ID = STRTUP_SHTDWN */ // Startup/Shutdown Warnings enum ss_wrn_t {SS_NO_WARN = 0, SS_RLD_PNDG = 1}; // Startup/Shutdown Information enum ss_inf_t {SS_NO_INFO = 0, SS_START_UP = 1}; /* *Structure for packet response statistics */ struct rspn_t { int npkt; int nspt; int nerr; int nberr; int nbto; int nwrn; int ninf; int nintr; int ndat; int nbad; int buf_cnt; int buf_typ; int totwrds; int ackn; }; #endif