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