1*19883Skarels /* @(#)if_exreg.h 6.1 (Berkeley) 05/01/85 */ 2*19883Skarels /* from @(#)if_exreg.h 1.2 (Excelan) 84/10/12 */ 3*19883Skarels 4*19883Skarels struct exdevice { 5*19883Skarels char xd_porta; /* write on porta resets EXOS */ 6*19883Skarels char xd_pad_a; 7*19883Skarels char xd_portb; /* write on portb interrupts EXOS */ 8*19883Skarels /* read on portb returns status bits */ 9*19883Skarels char xd_pad_b; 10*19883Skarels }; 11*19883Skarels 12*19883Skarels /* EXOS I/O PORT A write definitions */ 13*19883Skarels #define EX_RESET 0 /* value doesn't really matter... */ 14*19883Skarels 15*19883Skarels /* EXOS I/O PORT B write definitions */ 16*19883Skarels #define EX_NTRUPT 0 17*19883Skarels 18*19883Skarels /* EXOS I/O PORT B read definitions */ 19*19883Skarels #define EX_TESTOK 1 /* set when self-diagnostics passed */ 20*19883Skarels #define EX_UNREADY (1<<3) /* set until EXOS ready to read from B */ 21*19883Skarels 22*19883Skarels /* message buffer status field definitions */ 23*19883Skarels #define MH_OWNER 1 /* mask for status bit for owner */ 24*19883Skarels #define MH_HOST 0 /* if 0, the host owns the buffer */ 25*19883Skarels #define MH_EXOS 1 /* if 1, the EXOS owns the buffer */ 26*19883Skarels 27*19883Skarels /* EXOS Link Level request codes */ 28*19883Skarels #define LLTRANSMIT 0xC /* send a packet */ 29*19883Skarels #define LLRTRANSMIT 0xE /* send a packet, and self-receive */ 30*19883Skarels #define LLRECEIVE 0xD /* receive a packet */ 31*19883Skarels #define LLNET_MODE 0x8 /* read/write mode control objects */ 32*19883Skarels #define LLNET_ADDRS 0x9 /* read/write receive address slots */ 33*19883Skarels #define LLNET_RECV 0xA /* read/alter receive slot enable bit */ 34*19883Skarels #define LLNET_STSTCS 0xB /* read/reset network statistics objects */ 35*19883Skarels 36*19883Skarels /* Link Level return codes common to all requests */ 37*19883Skarels #define LL_OK 0 /* successful completion */ 38*19883Skarels #define LLX_MODE 0xA1 /* EXOS not in link level mode (impossible) */ 39*19883Skarels 40*19883Skarels /* LLTRANSMIT unique return codes */ 41*19883Skarels #define LLXM_1RTRY 0x1 /* successful xmission, 1 retry */ 42*19883Skarels #define LLXM_RTRYS 0x2 /* successful xmission, more than 1 retry */ 43*19883Skarels #define LLXM_NSQE 0x8 /* successful xmission, no SQE TEST signal */ 44*19883Skarels #define LLXM_CLSN 0x10 /* xmission failed, excess retries */ 45*19883Skarels #define LLXM_NCS 0x20 /* xmission failed, no carrier sense */ 46*19883Skarels #define LLXM_LNGTH 0x40 /* xmission failed, bad packet length */ 47*19883Skarels #define XMIT_BITS "\7\7LENGTH\6CARRIER\5XCLSNS\4SQETST" 48*19883Skarels #define LLXM_ERROR (LLXM_NSQE|LLXM_CLSN|LLXM_NCS|LLXM_LNGTH) 49*19883Skarels 50*19883Skarels /* LLRECEIVE unique return codes */ 51*19883Skarels #define LLRC_TRUNC 0x4 /* pkt received, but truncated to fit buffer */ 52*19883Skarels #define LLRC_ALIGN 0x10 /* pkt received, but with alignment error */ 53*19883Skarels #define LLRC_CRC 0x20 /* pkt received, but with CRC error */ 54*19883Skarels #define LLRC_BUFLEN 0x40 /* no pkt received, buffer less than 64 bytes */ 55*19883Skarels /* this should never happen here */ 56*19883Skarels #define RECV_BITS "\7\7BUFLEN\6CRC\5ALIGN\3TRUNC" 57*19883Skarels 58*19883Skarels /* LLNET_ADDRS unique return codes */ 59*19883Skarels #define LLNA_BADSLOT 0xD1 /* slot doesn't exist or can't be accessed */ 60*19883Skarels #define LLNA_BADADDR 0xD3 /* invalid address for designated slot */ 61*19883Skarels 62*19883Skarels /* LLNET_RECV unique return codes */ 63*19883Skarels #define LLNR_BADSLOT 0xD1 /* slot doesn't exist or can't be accessed */ 64*19883Skarels #define LLNR_BADADDR 0xD2 /* designated slot was empty */ 65*19883Skarels 66*19883Skarels /* address slot object indices */ 67*19883Skarels #define NULLSLOT 0 /* the null slot */ 68*19883Skarels #define MINMCSLOT 1 /* minimum multicast slot index */ 69*19883Skarels #define MAXMCSLOT 8 /* default maximum multicast slot index */ 70*19883Skarels #define PHYSSLOT 253 /* physical slot index */ 71*19883Skarels #define UNVRSSLOT 254 /* universal slot index */ 72*19883Skarels #define BROADSLOT 255 /* broadcast slot index */ 73*19883Skarels 74*19883Skarels /* request mask bit definitions */ 75*19883Skarels #define WRITE_OBJ 1 /* write the object */ 76*19883Skarels #define READ_OBJ 2 /* read the object */ 77*19883Skarels #define ENABLE_RCV 4 /* enable reception on designated slot */ 78*19883Skarels 79*19883Skarels /* NET_MODE options mask bit definitions */ 80*19883Skarels #define OPT_ALIGN 0x10 /* receive packets with alignment errors */ 81*19883Skarels #define OPT_CRC 0x20 /* receive packets with CRC errors */ 82*19883Skarels #define OPT_DSABLE 0x80 /* disconnect controller hardware */ 83*19883Skarels 84*19883Skarels /* NET_MODE mode field value definitions */ 85*19883Skarels #define MODE_OFF 0 /* stop transmission and reception */ 86*19883Skarels #define MODE_PERF 1 /* perfect multicast address filtering */ 87*19883Skarels #define MODE_HW 2 /* hardware-only multicast address filtering */ 88*19883Skarels #define MODE_PROM 3 /* promiscuous reception */ 89*19883Skarels 90*19883Skarels #define NFRAGMENTS 1 /* number fragments that the EXOS will scatter/gather */ 91*19883Skarels #define EXMAXRBUF 1520 /* per EXOS 101 manual 5.3.7 (maybe 1518 would do) */ 92*19883Skarels 93*19883Skarels /* 94*19883Skarels * N.B. Structures below are carefully constructed so that 95*19883Skarels * they correspond to the message formats that NX firmware 96*19883Skarels * defines. None of them should contain any compiler-instigated 97*19883Skarels * padding. Be especially careful about VAX C longword alignment! 98*19883Skarels */ 99*19883Skarels 100*19883Skarels struct stat_array { 101*19883Skarels u_long sa_fsent; /* frames sent without errors */ 102*19883Skarels u_long sa_xsclsn; /* frames aborted excess collisions */ 103*19883Skarels u_long sa_nsqe; /* frames subject to heartbeat failure */ 104*19883Skarels u_long sa_undef; /* undefined (TDR on EXOS 101) */ 105*19883Skarels u_long sa_frcvd; /* frames received no errors */ 106*19883Skarels u_long sa_align; /* frames received alignment error */ 107*19883Skarels u_long sa_crc; /* frames received crc error */ 108*19883Skarels u_long sa_flost; /* frames lost */ 109*19883Skarels }; 110*19883Skarels 111*19883Skarels struct buf_blk { /* packet/buffer block descriptor */ 112*19883Skarels u_short bb_len; /* length of block, in bytes */ 113*19883Skarels u_short bb_addr[2]; /* address of block */ 114*19883Skarels /* 115*19883Skarels * Array above is really a single u_long field. 116*19883Skarels * We kludge its definition to defeat word-alignment. 117*19883Skarels * Access would look like: 118*19883Skarels * longaddr = *(u_long *)bp->.mb_er.er_blks[0].bb_addr; 119*19883Skarels */ 120*19883Skarels }; 121*19883Skarels 122*19883Skarels struct net_mode { /* read/write mode control objects */ 123*19883Skarels /*12*/ u_char nm_rqst; /* request code */ 124*19883Skarels /*13*/ u_char nm_rply; /* reply code */ 125*19883Skarels /*14*/ u_char nm_mask; /* bit-wise switches for read, write */ 126*19883Skarels /*15*/ u_char nm_optn; /* acceptable packet reception errors */ 127*19883Skarels /*16*/ u_char nm_mode; /* EXOS filtering mode */ 128*19883Skarels /*17*/ 129*19883Skarels }; 130*19883Skarels 131*19883Skarels struct net_addrs { /* read/write receive address slots */ 132*19883Skarels /*12*/ u_char na_rqst; /* request code */ 133*19883Skarels /*13*/ u_char na_rply; /* reply code */ 134*19883Skarels /*14*/ u_char na_mask; /* bit-wise switches for read, write */ 135*19883Skarels /*15*/ u_char na_slot; /* index of address slot */ 136*19883Skarels /*16*/ u_char na_addrs[6]; /* address read and/or written */ 137*19883Skarels /*22*/ 138*19883Skarels }; 139*19883Skarels 140*19883Skarels struct net_recv { /* read/alter receive slot enable bit */ 141*19883Skarels /*12*/ u_char nr_rqst; /* request code */ 142*19883Skarels /*13*/ u_char nr_rply; /* reply code */ 143*19883Skarels /*14*/ u_char nr_mask; /* bit-wise switches for read, write */ 144*19883Skarels /*15*/ u_char nr_slot; /* index of address slot */ 145*19883Skarels /*16*/ 146*19883Skarels }; 147*19883Skarels 148*19883Skarels struct net_ststcs { /* read/reset network statistics objects */ 149*19883Skarels /*12*/ u_char ns_rqst; /* request code */ 150*19883Skarels /*13*/ u_char ns_rply; /* reply code */ 151*19883Skarels /*14*/ u_char ns_mask; /* bit-wise switches for read, write */ 152*19883Skarels /*15*/ u_char ns_rsrv; /* reserved for EXOS */ 153*19883Skarels /*16*/ u_short ns_nobj; /* number of objects to work on */ 154*19883Skarels /*18*/ u_short ns_xobj; /* index of first object to work on */ 155*19883Skarels /*20*/ u_long ns_bufp; /* pointer to statistics buffer */ 156*19883Skarels /*24*/ 157*19883Skarels }; 158*19883Skarels 159*19883Skarels struct enet_xmit { /* send a packet on the Ethernet */ 160*19883Skarels /*12*/ u_char et_rqst; /* request code */ 161*19883Skarels /*13*/ u_char et_rply; /* reply code */ 162*19883Skarels /*14*/ u_char et_slot; /* address slot matching dest address */ 163*19883Skarels /*15*/ u_char et_nblock; /* number of blocks composing packet */ 164*19883Skarels /*16*/ struct buf_blk et_blks[NFRAGMENTS]; /* array of block descriptors */ 165*19883Skarels /*22-64*/ 166*19883Skarels }; 167*19883Skarels 168*19883Skarels struct enet_recv { /* receive a packet on the Ethernet */ 169*19883Skarels /*12*/ u_char er_rqst; /* request code */ 170*19883Skarels /*13*/ u_char er_rply; /* reply code */ 171*19883Skarels /*14*/ u_char er_slot; /* address slot matching dest address */ 172*19883Skarels /*15*/ u_char er_nblock; /* number of blocks composing buffer */ 173*19883Skarels /*16*/ struct buf_blk er_blks[NFRAGMENTS]; /* array of block descriptors */ 174*19883Skarels /*22-64*/ 175*19883Skarels }; 176*19883Skarels 177*19883Skarels /* we send requests and receive replys with the EXOS using this structure */ 178*19883Skarels struct ex_msg { 179*19883Skarels /*00*/ u_short mb_link; /* address of next message buffer */ 180*19883Skarels /*02*/ u_char mb_rsrv; /* reserved for use by EXOS */ 181*19883Skarels /*03*/ u_char mb_status; /* used bit-wise for message protocol */ 182*19883Skarels /*04*/ u_short mb_length; /* length, in bytes, of the rest */ 183*19883Skarels /*06*/ short mb_1rsrv; /* reserved for used by EXOS */ 184*19883Skarels /*08*/ long mb_mid; /* available to user */ 185*19883Skarels /*12*/ union mb_all { 186*19883Skarels struct net_mode mb_net_mode; 187*19883Skarels struct net_addrs mb_net_addrs; 188*19883Skarels struct net_recv mb_net_recv; 189*19883Skarels struct net_ststcs mb_net_ststcs; 190*19883Skarels struct enet_xmit mb_enet_xmit; 191*19883Skarels struct enet_recv mb_enet_recv; 192*19883Skarels } mb_all; 193*19883Skarels /* following field is used only by host, not read by board */ 194*19883Skarels struct ex_msg *mb_next; /* host's pointer to next message */ 195*19883Skarels }; 196*19883Skarels #define mb_nm mb_all.mb_net_mode 197*19883Skarels #define mb_na mb_all.mb_net_addrs 198*19883Skarels #define mb_nr mb_all.mb_net_recv 199*19883Skarels #define mb_ns mb_all.mb_net_ststcs 200*19883Skarels #define mb_et mb_all.mb_enet_xmit 201*19883Skarels #define mb_er mb_all.mb_enet_recv 202*19883Skarels #define mb_rqst mb_nm.nm_rqst 203*19883Skarels #define mb_rply mb_nm.nm_rply 204*19883Skarels #define MBDATALEN (sizeof(union mb_all)+6) 205*19883Skarels 206*19883Skarels struct confmsg { 207*19883Skarels /*00*/ u_short cm_1rsrv; /* reserved, must be 1 */ 208*19883Skarels /*02*/ char cm_vc[4]; /* returns ASCII version code */ 209*19883Skarels /*06*/ u_char cm_cc; /* returns config completion code */ 210*19883Skarels /*07*/ u_char cm_opmode; /* specifies operation mode */ 211*19883Skarels /*08*/ u_short cm_dfo; /* specifies host data format option */ 212*19883Skarels /*10*/ u_char cm_dcn1; /* reserved, must be 1 */ 213*19883Skarels /*11*/ u_char cm_2rsrv[2]; /* reserved, must be 0 */ 214*19883Skarels /*13*/ u_char cm_ham; /* specifies host address mode */ 215*19883Skarels /*14*/ u_char cm_3rsrv; /* reserved, must be 0 */ 216*19883Skarels /*15*/ u_char cm_mapsiz; /* reserved, must be 0 */ 217*19883Skarels /*16*/ u_char cm_byteptrn[4]; /* host data format option test pattern */ 218*19883Skarels /*20*/ u_short cm_wordptrn[2]; 219*19883Skarels /*24*/ u_long cm_lwordptrn; 220*19883Skarels /*28*/ u_char cm_rsrvd[20]; 221*19883Skarels /*48*/ u_long cm_mba; /* use 0xFFFFFFFF in link level mode */ 222*19883Skarels /*52*/ u_char cm_nproc; /* use 0xFF in link level mode */ 223*19883Skarels /*53*/ u_char cm_nmbox; /* use 0xFF in link level mode */ 224*19883Skarels /*54*/ u_char cm_nmcast; /* use 0xFF in link level mode */ 225*19883Skarels /*55*/ u_char cm_nhost; /* use 1 in link level mode */ 226*19883Skarels 227*19883Skarels /* the next five parameters define the request message queue */ 228*19883Skarels /*56*/ u_long cm_h2xba; /* base address of message queue */ 229*19883Skarels /*60*/ u_short cm_h2xhdr; /* address offset of msg Q header */ 230*19883Skarels /*62*/ u_char cm_h2xtyp; /* interrupt type */ 231*19883Skarels /*63*/ u_char cm_h2xval; /* interrupt value (not used) */ 232*19883Skarels /*64*/ u_short cm_h2xaddr; /* interrupt vector */ 233*19883Skarels /*66*/ u_short cm_h2xpad; /* pad out unused portion of vector */ 234*19883Skarels 235*19883Skarels /* the next five parameters define the reply message queue */ 236*19883Skarels /*68*/ u_long cm_x2hba; /* base address of message queue */ 237*19883Skarels /*72*/ u_short cm_x2hhdr; /* address offset of msg Q header */ 238*19883Skarels /*74*/ u_char cm_x2htyp; /* interrupt type */ 239*19883Skarels /*75*/ u_char cm_x2hval; /* interrupt value (not used) */ 240*19883Skarels /*76*/ u_short cm_x2haddr; /* interrupt vector */ 241*19883Skarels /*78*/ u_short cm_x2hpad; /* pad out unused portion of vector */ 242*19883Skarels /*80*/ 243*19883Skarels }; 244*19883Skarels 245