137111Ssklower /* 237111Ssklower * Copyright (c) 1989 The Regents of the University of California. 337111Ssklower * All rights reserved. 437111Ssklower * 537111Ssklower * This code is derived from software contributed to Berkeley by 637111Ssklower * Excelan Inc. 737111Ssklower * 8*44532Sbostic * %sccs.include.redist.c% 937111Ssklower * 10*44532Sbostic * @(#)if_exreg.h 7.3 (Berkeley) 06/28/90 1137111Ssklower */ 1237111Ssklower 1337111Ssklower struct exdevice { 1437111Ssklower ushort ex_porta; /* write on porta resets EXOS */ 1537111Ssklower ushort ex_portb; /* write on portb interrupts EXOS */ 1637111Ssklower }; 1737111Ssklower 1837111Ssklower /* EXOS I/O PORT A write definitions */ 1937111Ssklower #define EX_RESET 0 /* value doesn't really matter... */ 2037111Ssklower 2137111Ssklower /* EXOS I/O PORT B write definitions */ 2237111Ssklower #define EX_NTRUPT 0 2337111Ssklower 2437111Ssklower /* EXOS I/O PORT B read definitions */ 2537111Ssklower #define EX_TESTOK 1 /* set when self-diagnostics passed */ 2637111Ssklower #define EX_UNREADY (1<<3) /* set until EXOS ready to read from B */ 2737111Ssklower 2837111Ssklower /* message buffer status field definitions */ 2937111Ssklower #define MH_OWNER 1 /* mask for status bit for owner */ 3037111Ssklower #define MH_HOST 0 /* if 0, the host owns the buffer */ 3137111Ssklower #define MH_EXOS 1 /* if 1, the EXOS owns the buffer */ 3237111Ssklower 3337111Ssklower /* EXOS Link Level request codes */ 3437111Ssklower #define LLTRANSMIT 0xC /* send a packet */ 3537111Ssklower #define LLRTRANSMIT 0xE /* send a packet, and self-receive */ 3637111Ssklower #define LLRECEIVE 0xD /* receive a packet */ 3737111Ssklower #define LLNET_MODE 0x8 /* read/write mode control objects */ 3837111Ssklower #define LLNET_ADDRS 0x9 /* read/write receive address slots */ 3937111Ssklower #define LLNET_RECV 0xA /* read/alter receive slot enable bit */ 4037111Ssklower #define LLNET_STSTCS 0xB /* read/reset network statistics objects */ 4137111Ssklower 4237111Ssklower /* Link Level return codes common to all requests */ 4337111Ssklower #define LL_OK 0 /* successful completion */ 4437111Ssklower #define LLX_MODE 0xA1 /* EXOS not in link level mode (impossible) */ 4537111Ssklower 4637111Ssklower /* LLTRANSMIT unique return codes */ 4737111Ssklower #define LLXM_1RTRY 0x1 /* successful xmission, 1 retry */ 4837111Ssklower #define LLXM_RTRYS 0x2 /* successful xmission, more than 1 retry */ 4937111Ssklower #define LLXM_NSQE 0x8 /* successful xmission, no SQE TEST signal */ 5037111Ssklower #define LLXM_CLSN 0x10 /* xmission failed, excess retries */ 5137111Ssklower #define LLXM_NCS 0x20 /* xmission failed, no carrier sense */ 5237111Ssklower #define LLXM_LNGTH 0x40 /* xmission failed, bad packet length */ 5337111Ssklower #define XMIT_BITS "\7\7LENGTH\6CARRIER\5XCLSNS\4SQETST" 5437474Ssklower /*#define LLXM_ERROR (LLXM_NSQE|LLXM_CLSN|LLXM_NCS|LLXM_LNGTH)*/ 5537474Ssklower #define LLXM_ERROR (LLXM_CLSN|LLXM_NCS|LLXM_LNGTH) 5637111Ssklower 5737111Ssklower /* LLRECEIVE unique return codes */ 5837111Ssklower #define LLRC_TRUNC 0x4 /* pkt received, but truncated to fit buffer */ 5937111Ssklower #define LLRC_ALIGN 0x10 /* pkt received, but with alignment error */ 6037111Ssklower #define LLRC_CRC 0x20 /* pkt received, but with CRC error */ 6137111Ssklower #define LLRC_BUFLEN 0x40 /* no pkt received, buffer less than 64 bytes */ 6237111Ssklower /* this should never happen here */ 6337111Ssklower #define RECV_BITS "\7\7BUFLEN\6CRC\5ALIGN\3TRUNC" 6437111Ssklower 6537111Ssklower /* LLNET_ADDRS unique return codes */ 6637111Ssklower #define LLNA_BADSLOT 0xD1 /* slot doesn't exist or can't be accessed */ 6737111Ssklower #define LLNA_BADADDR 0xD3 /* invalid address for designated slot */ 6837111Ssklower 6937111Ssklower /* LLNET_RECV unique return codes */ 7037111Ssklower #define LLNR_BADSLOT 0xD1 /* slot doesn't exist or can't be accessed */ 7137111Ssklower #define LLNR_BADADDR 0xD2 /* designated slot was empty */ 7237111Ssklower 7337111Ssklower /* address slot object indices */ 7437111Ssklower #define NULLSLOT 0 /* the null slot */ 7537111Ssklower #define MINMCSLOT 1 /* minimum multicast slot index */ 7637111Ssklower #define MAXMCSLOT 8 /* default maximum multicast slot index */ 7737111Ssklower #define PHYSSLOT 253 /* physical slot index */ 7837111Ssklower #define UNVRSSLOT 254 /* universal slot index */ 7937111Ssklower #define BROADSLOT 255 /* broadcast slot index */ 8037111Ssklower 8137111Ssklower /* request mask bit definitions */ 8237111Ssklower #define WRITE_OBJ 1 /* write the object */ 8337111Ssklower #define READ_OBJ 2 /* read the object */ 8437111Ssklower #define ENABLE_RCV 4 /* enable reception on designated slot */ 8537111Ssklower 8637111Ssklower /* NET_MODE options mask bit definitions */ 8737111Ssklower #define OPT_ALIGN 0x10 /* receive packets with alignment errors */ 8837111Ssklower #define OPT_CRC 0x20 /* receive packets with CRC errors */ 8937111Ssklower #define OPT_DSABLE 0x80 /* disconnect controller hardware */ 9037111Ssklower 9137111Ssklower /* NET_MODE mode field value definitions */ 9237111Ssklower #define MODE_OFF 0 /* stop transmission and reception */ 9337111Ssklower #define MODE_PERF 1 /* perfect multicast address filtering */ 9437111Ssklower #define MODE_HW 2 /* hardware-only multicast address filtering */ 9537111Ssklower #define MODE_PROM 3 /* promiscuous reception */ 9637111Ssklower 9737111Ssklower #define NFRAGMENTS 8 /* number fragments that the EXOS will scatter/gather */ 9837111Ssklower #define EXMAXRBUF 1518 /* per EXOS 202 manual 5.3.7 (maybe 1518 would do) */ 9937111Ssklower 10037111Ssklower /* 10137111Ssklower * N.B. Structures below are carefully constructed so that 10237111Ssklower * they correspond to the message formats that NX firmware 10337111Ssklower * defines. None of them should contain any compiler-instigated 10437111Ssklower * padding. Be especially careful about VAX C longword alignment! 10537111Ssklower */ 10637111Ssklower 10737474Ssklower struct ex_stat { 10837111Ssklower u_long sa_fsent; /* frames sent without errors */ 10937111Ssklower u_long sa_xsclsn; /* frames aborted excess collisions */ 11037111Ssklower u_long sa_nsqe; /* frames subject to heartbeat failure */ 11137111Ssklower u_long sa_undef; /* undefined (TDR on EXOS 101) */ 11237111Ssklower u_long sa_frcvd; /* frames received no errors */ 11337111Ssklower u_long sa_align; /* frames received alignment error */ 11437111Ssklower u_long sa_crc; /* frames received crc error */ 11537111Ssklower u_long sa_flost; /* frames lost */ 11637111Ssklower }; 11737111Ssklower 11837111Ssklower struct buf_blk { /* packet/buffer block descriptor */ 11937111Ssklower u_short bb_len; /* length of block, in bytes */ 12037111Ssklower struct i86_long { 12137111Ssklower u_short realaddr[2]; /* address of block */ 12237111Ssklower } bb_addr; 12337111Ssklower /* 12437111Ssklower * Array above is really a single u_long field. 12537111Ssklower * We kludge its definition to defeat word-alignment. 12637111Ssklower */ 12737111Ssklower }; 12837111Ssklower 12937111Ssklower struct net_mode { /* read/write mode control objects */ 13037111Ssklower /*12*/ u_char nm_rqst; /* request code */ 13137111Ssklower /*13*/ u_char nm_rply; /* reply code */ 13237111Ssklower /*14*/ u_char nm_mask; /* bit-wise switches for read, write */ 13337111Ssklower /*15*/ u_char nm_optn; /* acceptable packet reception errors */ 13437111Ssklower /*16*/ u_char nm_mode; /* EXOS filtering mode */ 13537111Ssklower /*17*/ 13637111Ssklower }; 13737111Ssklower 13837111Ssklower struct net_addrs { /* read/write receive address slots */ 13937111Ssklower /*12*/ u_char na_rqst; /* request code */ 14037111Ssklower /*13*/ u_char na_rply; /* reply code */ 14137111Ssklower /*14*/ u_char na_mask; /* bit-wise switches for read, write */ 14237111Ssklower /*15*/ u_char na_slot; /* index of address slot */ 14337111Ssklower /*16*/ u_char na_addrs[6]; /* address read and/or written */ 14437111Ssklower /*22*/ 14537111Ssklower }; 14637111Ssklower 14737111Ssklower struct net_recv { /* read/alter receive slot enable bit */ 14837111Ssklower /*12*/ u_char nr_rqst; /* request code */ 14937111Ssklower /*13*/ u_char nr_rply; /* reply code */ 15037111Ssklower /*14*/ u_char nr_mask; /* bit-wise switches for read, write */ 15137111Ssklower /*15*/ u_char nr_slot; /* index of address slot */ 15237111Ssklower /*16*/ 15337111Ssklower }; 15437111Ssklower 15537111Ssklower struct net_ststcs { /* read/reset network statistics objects */ 15637111Ssklower /*12*/ u_char ns_rqst; /* request code */ 15737111Ssklower /*13*/ u_char ns_rply; /* reply code */ 15837111Ssklower /*14*/ u_char ns_mask; /* bit-wise switches for read, write */ 15937111Ssklower /*15*/ u_char ns_rsrv; /* reserved for EXOS */ 16037111Ssklower /*16*/ u_short ns_nobj; /* number of objects to work on */ 16137111Ssklower /*18*/ u_short ns_xobj; /* index of first object to work on */ 16237111Ssklower /*20*/ u_long ns_bufp; /* pointer to statistics buffer */ 16337111Ssklower /*24*/ 16437111Ssklower }; 16537111Ssklower 16637111Ssklower struct enet_xmit { /* send a packet on the Ethernet */ 16737111Ssklower /*12*/ u_char et_rqst; /* request code */ 16837111Ssklower /*13*/ u_char et_rply; /* reply code */ 16937111Ssklower /*14*/ u_char et_slot; /* address slot matching dest address */ 17037111Ssklower /*15*/ u_char et_nblock; /* number of blocks composing packet */ 17137111Ssklower /*16*/ struct buf_blk et_blks[NFRAGMENTS]; /* array of block descriptors */ 17237111Ssklower /*22-64*/ 17337111Ssklower }; 17437111Ssklower 17537111Ssklower struct enet_recv { /* receive a packet on the Ethernet */ 17637111Ssklower /*12*/ u_char er_rqst; /* request code */ 17737111Ssklower /*13*/ u_char er_rply; /* reply code */ 17837111Ssklower /*14*/ u_char er_slot; /* address slot matching dest address */ 17937111Ssklower /*15*/ u_char er_nblock; /* number of blocks composing buffer */ 18037111Ssklower /*16*/ struct buf_blk er_blks[NFRAGMENTS]; /* array of block descriptors */ 18137111Ssklower /*22-64*/ 18237111Ssklower }; 18337111Ssklower 18437111Ssklower /* we send requests and receive replys with the EXOS using this structure */ 18537111Ssklower struct ex_msg { 18637111Ssklower /*00*/ u_short mb_link; /* address of next message buffer */ 18737111Ssklower /*02*/ u_char mb_rsrv; /* reserved for use by EXOS */ 18837111Ssklower /*03*/ u_char mb_status; /* used bit-wise for message protocol */ 18937111Ssklower /*04*/ u_short mb_length; /* length, in bytes, of the rest */ 19037111Ssklower /*06*/ short mb_1rsrv; /* reserved for used by EXOS */ 19137111Ssklower /*08*/ struct ifvba *mb_pkb; /* available to user */ 19237111Ssklower /*12*/ union mb_all { 19337111Ssklower struct net_mode mb_net_mode; 19437111Ssklower struct net_addrs mb_net_addrs; 19537111Ssklower struct net_recv mb_net_recv; 19637111Ssklower struct net_ststcs mb_net_ststcs; 19737111Ssklower struct enet_xmit mb_enet_xmit; 19837111Ssklower struct enet_recv mb_enet_recv; 19937111Ssklower } mb_all; 20037111Ssklower /* following field is used only by host, not read by board */ 20137111Ssklower struct ex_msg *mb_next; /* host's pointer to next message */ 20237111Ssklower }; 20337111Ssklower #define mb_nm mb_all.mb_net_mode 20437111Ssklower #define mb_na mb_all.mb_net_addrs 20537111Ssklower #define mb_nr mb_all.mb_net_recv 20637111Ssklower #define mb_ns mb_all.mb_net_ststcs 20737111Ssklower #define mb_et mb_all.mb_enet_xmit 20837111Ssklower #define mb_er mb_all.mb_enet_recv 20937111Ssklower #define mb_rqst mb_nm.nm_rqst 21037111Ssklower #define mb_rply mb_nm.nm_rply 21137111Ssklower #define MBDATALEN (sizeof(union mb_all)+6) 21237111Ssklower 21337474Ssklower struct ex_conf { 21437111Ssklower /*00*/ u_short cm_1rsrv; /* reserved, must be 1 */ 21537111Ssklower /*02*/ char cm_vc[4]; /* returns ASCII version code */ 21637111Ssklower /*06*/ u_char cm_cc; /* returns config completion code */ 21737111Ssklower /*07*/ u_char cm_opmode; /* specifies operation mode */ 21837111Ssklower /*08*/ u_short cm_dfo; /* specifies host data format option */ 21937111Ssklower /*00*/ u_char cm_dcn1; /* reserved, must be 1 */ 22037111Ssklower /*11*/ u_char cm_2rsrv[2]; /* reserved, must be 0 */ 22137111Ssklower /*13*/ u_char cm_ham; /* specifies host address mode */ 22237111Ssklower /*14*/ u_char cm_3rsrv; /* reserved, must be 0 */ 22337111Ssklower /*15*/ u_char cm_mapsiz; /* reserved, must be 0 */ 22437111Ssklower /*16*/ u_char cm_byteptrn[4]; /* host data format option test pattern */ 22537111Ssklower /*20*/ u_short cm_wordptrn[2]; 22637111Ssklower /*24*/ u_long cm_lwordptrn; 22737111Ssklower /*28*/ u_char cm_rsrvd[20]; 22837111Ssklower /*48*/ u_long cm_mba; /* use 0xFFFFFFFF in link level mode */ 22937111Ssklower /*52*/ u_char cm_nproc; /* use 0xFF in link level mode */ 23037111Ssklower /*53*/ u_char cm_nmbox; /* use 0xFF in link level mode */ 23137111Ssklower /*54*/ u_char cm_nmcast; /* use 0xFF in link level mode */ 23237111Ssklower /*55*/ u_char cm_nhost; /* use 1 in link level mode */ 23337111Ssklower 23437111Ssklower /* the next five parameters define the request message queue */ 23537111Ssklower /*56*/ u_long cm_h2xba; /* base address of message queue */ 23637111Ssklower /*60*/ u_short cm_h2xhdr; /* address offset of msg Q header */ 23737111Ssklower /*62*/ u_char cm_h2xtyp; /* interrupt type */ 23837111Ssklower /*63*/ u_char cm_h2xval; /* interrupt value (not used) */ 23937111Ssklower /*64*/ u_short cm_h2xaddr; /* interrupt vector */ 24037111Ssklower /*66*/ u_short cm_h2xpad; /* pad out unused portion of vector */ 24137111Ssklower 24237111Ssklower /* the next five parameters define the reply message queue */ 24337111Ssklower /*68*/ u_long cm_x2hba; /* base address of message queue */ 24437111Ssklower /*72*/ u_short cm_x2hhdr; /* address offset of msg Q header */ 24537111Ssklower /*74*/ u_char cm_x2htyp; /* interrupt type */ 24637111Ssklower /*75*/ u_char cm_x2hval; /* interrupt value (not used) */ 24737111Ssklower /*76*/ u_short cm_x2haddr; /* interrupt vector */ 24837111Ssklower /*78*/ u_short cm_x2hpad; /* pad out unused portion of vector */ 24937111Ssklower /*80*/ 25037111Ssklower }; 251