123293Smckusick /* 229280Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 335320Sbostic * All rights reserved. 423293Smckusick * 535320Sbostic * This code is derived from software contributed to Berkeley by 635320Sbostic * Excelan Inc. 735320Sbostic * 8*44559Sbostic * %sccs.include.redist.c% 935320Sbostic * 10*44559Sbostic * @(#)if_exreg.h 7.3 (Berkeley) 06/28/90 1123293Smckusick */ 1219883Skarels 1319883Skarels struct exdevice { 1419883Skarels char xd_porta; /* write on porta resets EXOS */ 1519883Skarels char xd_pad_a; 1619883Skarels char xd_portb; /* write on portb interrupts EXOS */ 1719883Skarels /* read on portb returns status bits */ 1819883Skarels char xd_pad_b; 1919883Skarels }; 2019883Skarels 2119883Skarels /* EXOS I/O PORT A write definitions */ 2219883Skarels #define EX_RESET 0 /* value doesn't really matter... */ 2319883Skarels 2419883Skarels /* EXOS I/O PORT B write definitions */ 2519883Skarels #define EX_NTRUPT 0 2619883Skarels 2719883Skarels /* EXOS I/O PORT B read definitions */ 2819883Skarels #define EX_TESTOK 1 /* set when self-diagnostics passed */ 2919883Skarels #define EX_UNREADY (1<<3) /* set until EXOS ready to read from B */ 3019883Skarels 3119883Skarels /* message buffer status field definitions */ 3219883Skarels #define MH_OWNER 1 /* mask for status bit for owner */ 3319883Skarels #define MH_HOST 0 /* if 0, the host owns the buffer */ 3419883Skarels #define MH_EXOS 1 /* if 1, the EXOS owns the buffer */ 3519883Skarels 3619883Skarels /* EXOS Link Level request codes */ 3719883Skarels #define LLTRANSMIT 0xC /* send a packet */ 3819883Skarels #define LLRTRANSMIT 0xE /* send a packet, and self-receive */ 3919883Skarels #define LLRECEIVE 0xD /* receive a packet */ 4019883Skarels #define LLNET_MODE 0x8 /* read/write mode control objects */ 4119883Skarels #define LLNET_ADDRS 0x9 /* read/write receive address slots */ 4219883Skarels #define LLNET_RECV 0xA /* read/alter receive slot enable bit */ 4319883Skarels #define LLNET_STSTCS 0xB /* read/reset network statistics objects */ 4419883Skarels 4519883Skarels /* Link Level return codes common to all requests */ 4619883Skarels #define LL_OK 0 /* successful completion */ 4719883Skarels #define LLX_MODE 0xA1 /* EXOS not in link level mode (impossible) */ 4819883Skarels 4919883Skarels /* LLTRANSMIT unique return codes */ 5019883Skarels #define LLXM_1RTRY 0x1 /* successful xmission, 1 retry */ 5119883Skarels #define LLXM_RTRYS 0x2 /* successful xmission, more than 1 retry */ 5219883Skarels #define LLXM_NSQE 0x8 /* successful xmission, no SQE TEST signal */ 5319883Skarels #define LLXM_CLSN 0x10 /* xmission failed, excess retries */ 5419883Skarels #define LLXM_NCS 0x20 /* xmission failed, no carrier sense */ 5519883Skarels #define LLXM_LNGTH 0x40 /* xmission failed, bad packet length */ 5619883Skarels #define XMIT_BITS "\7\7LENGTH\6CARRIER\5XCLSNS\4SQETST" 5719883Skarels #define LLXM_ERROR (LLXM_NSQE|LLXM_CLSN|LLXM_NCS|LLXM_LNGTH) 5819883Skarels 5919883Skarels /* LLRECEIVE unique return codes */ 6019883Skarels #define LLRC_TRUNC 0x4 /* pkt received, but truncated to fit buffer */ 6119883Skarels #define LLRC_ALIGN 0x10 /* pkt received, but with alignment error */ 6219883Skarels #define LLRC_CRC 0x20 /* pkt received, but with CRC error */ 6319883Skarels #define LLRC_BUFLEN 0x40 /* no pkt received, buffer less than 64 bytes */ 6419883Skarels /* this should never happen here */ 6519883Skarels #define RECV_BITS "\7\7BUFLEN\6CRC\5ALIGN\3TRUNC" 6619883Skarels 6719883Skarels /* LLNET_ADDRS unique return codes */ 6819883Skarels #define LLNA_BADSLOT 0xD1 /* slot doesn't exist or can't be accessed */ 6919883Skarels #define LLNA_BADADDR 0xD3 /* invalid address for designated slot */ 7019883Skarels 7119883Skarels /* LLNET_RECV unique return codes */ 7219883Skarels #define LLNR_BADSLOT 0xD1 /* slot doesn't exist or can't be accessed */ 7319883Skarels #define LLNR_BADADDR 0xD2 /* designated slot was empty */ 7419883Skarels 7519883Skarels /* address slot object indices */ 7619883Skarels #define NULLSLOT 0 /* the null slot */ 7719883Skarels #define MINMCSLOT 1 /* minimum multicast slot index */ 7819883Skarels #define MAXMCSLOT 8 /* default maximum multicast slot index */ 7919883Skarels #define PHYSSLOT 253 /* physical slot index */ 8019883Skarels #define UNVRSSLOT 254 /* universal slot index */ 8119883Skarels #define BROADSLOT 255 /* broadcast slot index */ 8219883Skarels 8319883Skarels /* request mask bit definitions */ 8419883Skarels #define WRITE_OBJ 1 /* write the object */ 8519883Skarels #define READ_OBJ 2 /* read the object */ 8619883Skarels #define ENABLE_RCV 4 /* enable reception on designated slot */ 8719883Skarels 8819883Skarels /* NET_MODE options mask bit definitions */ 8919883Skarels #define OPT_ALIGN 0x10 /* receive packets with alignment errors */ 9019883Skarels #define OPT_CRC 0x20 /* receive packets with CRC errors */ 9119883Skarels #define OPT_DSABLE 0x80 /* disconnect controller hardware */ 9219883Skarels 9319883Skarels /* NET_MODE mode field value definitions */ 9419883Skarels #define MODE_OFF 0 /* stop transmission and reception */ 9519883Skarels #define MODE_PERF 1 /* perfect multicast address filtering */ 9619883Skarels #define MODE_HW 2 /* hardware-only multicast address filtering */ 9719883Skarels #define MODE_PROM 3 /* promiscuous reception */ 9819883Skarels 9919883Skarels #define NFRAGMENTS 1 /* number fragments that the EXOS will scatter/gather */ 10019883Skarels #define EXMAXRBUF 1520 /* per EXOS 101 manual 5.3.7 (maybe 1518 would do) */ 10119883Skarels 10219883Skarels /* 10319883Skarels * N.B. Structures below are carefully constructed so that 10419883Skarels * they correspond to the message formats that NX firmware 10519883Skarels * defines. None of them should contain any compiler-instigated 10619883Skarels * padding. Be especially careful about VAX C longword alignment! 10719883Skarels */ 10819883Skarels 10919883Skarels struct stat_array { 11019883Skarels u_long sa_fsent; /* frames sent without errors */ 11119883Skarels u_long sa_xsclsn; /* frames aborted excess collisions */ 11219883Skarels u_long sa_nsqe; /* frames subject to heartbeat failure */ 11319883Skarels u_long sa_undef; /* undefined (TDR on EXOS 101) */ 11419883Skarels u_long sa_frcvd; /* frames received no errors */ 11519883Skarels u_long sa_align; /* frames received alignment error */ 11619883Skarels u_long sa_crc; /* frames received crc error */ 11719883Skarels u_long sa_flost; /* frames lost */ 11819883Skarels }; 11919883Skarels 12019883Skarels struct buf_blk { /* packet/buffer block descriptor */ 12119883Skarels u_short bb_len; /* length of block, in bytes */ 12219883Skarels u_short bb_addr[2]; /* address of block */ 12319883Skarels /* 12419883Skarels * Array above is really a single u_long field. 12519883Skarels * We kludge its definition to defeat word-alignment. 12619883Skarels * Access would look like: 12719883Skarels * longaddr = *(u_long *)bp->.mb_er.er_blks[0].bb_addr; 12819883Skarels */ 12919883Skarels }; 13019883Skarels 13119883Skarels struct net_mode { /* read/write mode control objects */ 13219883Skarels /*12*/ u_char nm_rqst; /* request code */ 13319883Skarels /*13*/ u_char nm_rply; /* reply code */ 13419883Skarels /*14*/ u_char nm_mask; /* bit-wise switches for read, write */ 13519883Skarels /*15*/ u_char nm_optn; /* acceptable packet reception errors */ 13619883Skarels /*16*/ u_char nm_mode; /* EXOS filtering mode */ 13719883Skarels /*17*/ 13819883Skarels }; 13919883Skarels 14019883Skarels struct net_addrs { /* read/write receive address slots */ 14119883Skarels /*12*/ u_char na_rqst; /* request code */ 14219883Skarels /*13*/ u_char na_rply; /* reply code */ 14319883Skarels /*14*/ u_char na_mask; /* bit-wise switches for read, write */ 14419883Skarels /*15*/ u_char na_slot; /* index of address slot */ 14519883Skarels /*16*/ u_char na_addrs[6]; /* address read and/or written */ 14619883Skarels /*22*/ 14719883Skarels }; 14819883Skarels 14919883Skarels struct net_recv { /* read/alter receive slot enable bit */ 15019883Skarels /*12*/ u_char nr_rqst; /* request code */ 15119883Skarels /*13*/ u_char nr_rply; /* reply code */ 15219883Skarels /*14*/ u_char nr_mask; /* bit-wise switches for read, write */ 15319883Skarels /*15*/ u_char nr_slot; /* index of address slot */ 15419883Skarels /*16*/ 15519883Skarels }; 15619883Skarels 15719883Skarels struct net_ststcs { /* read/reset network statistics objects */ 15819883Skarels /*12*/ u_char ns_rqst; /* request code */ 15919883Skarels /*13*/ u_char ns_rply; /* reply code */ 16019883Skarels /*14*/ u_char ns_mask; /* bit-wise switches for read, write */ 16119883Skarels /*15*/ u_char ns_rsrv; /* reserved for EXOS */ 16219883Skarels /*16*/ u_short ns_nobj; /* number of objects to work on */ 16319883Skarels /*18*/ u_short ns_xobj; /* index of first object to work on */ 16419883Skarels /*20*/ u_long ns_bufp; /* pointer to statistics buffer */ 16519883Skarels /*24*/ 16619883Skarels }; 16719883Skarels 16819883Skarels struct enet_xmit { /* send a packet on the Ethernet */ 16919883Skarels /*12*/ u_char et_rqst; /* request code */ 17019883Skarels /*13*/ u_char et_rply; /* reply code */ 17119883Skarels /*14*/ u_char et_slot; /* address slot matching dest address */ 17219883Skarels /*15*/ u_char et_nblock; /* number of blocks composing packet */ 17319883Skarels /*16*/ struct buf_blk et_blks[NFRAGMENTS]; /* array of block descriptors */ 17419883Skarels /*22-64*/ 17519883Skarels }; 17619883Skarels 17719883Skarels struct enet_recv { /* receive a packet on the Ethernet */ 17819883Skarels /*12*/ u_char er_rqst; /* request code */ 17919883Skarels /*13*/ u_char er_rply; /* reply code */ 18019883Skarels /*14*/ u_char er_slot; /* address slot matching dest address */ 18119883Skarels /*15*/ u_char er_nblock; /* number of blocks composing buffer */ 18219883Skarels /*16*/ struct buf_blk er_blks[NFRAGMENTS]; /* array of block descriptors */ 18319883Skarels /*22-64*/ 18419883Skarels }; 18519883Skarels 18619883Skarels /* we send requests and receive replys with the EXOS using this structure */ 18719883Skarels struct ex_msg { 18819883Skarels /*00*/ u_short mb_link; /* address of next message buffer */ 18919883Skarels /*02*/ u_char mb_rsrv; /* reserved for use by EXOS */ 19019883Skarels /*03*/ u_char mb_status; /* used bit-wise for message protocol */ 19119883Skarels /*04*/ u_short mb_length; /* length, in bytes, of the rest */ 19219883Skarels /*06*/ short mb_1rsrv; /* reserved for used by EXOS */ 19319883Skarels /*08*/ long mb_mid; /* available to user */ 19419883Skarels /*12*/ union mb_all { 19519883Skarels struct net_mode mb_net_mode; 19619883Skarels struct net_addrs mb_net_addrs; 19719883Skarels struct net_recv mb_net_recv; 19819883Skarels struct net_ststcs mb_net_ststcs; 19919883Skarels struct enet_xmit mb_enet_xmit; 20019883Skarels struct enet_recv mb_enet_recv; 20119883Skarels } mb_all; 20219883Skarels /* following field is used only by host, not read by board */ 20319883Skarels struct ex_msg *mb_next; /* host's pointer to next message */ 20419883Skarels }; 20519883Skarels #define mb_nm mb_all.mb_net_mode 20619883Skarels #define mb_na mb_all.mb_net_addrs 20719883Skarels #define mb_nr mb_all.mb_net_recv 20819883Skarels #define mb_ns mb_all.mb_net_ststcs 20919883Skarels #define mb_et mb_all.mb_enet_xmit 21019883Skarels #define mb_er mb_all.mb_enet_recv 21119883Skarels #define mb_rqst mb_nm.nm_rqst 21219883Skarels #define mb_rply mb_nm.nm_rply 21319883Skarels #define MBDATALEN (sizeof(union mb_all)+6) 21419883Skarels 21519883Skarels struct confmsg { 21619883Skarels /*00*/ u_short cm_1rsrv; /* reserved, must be 1 */ 21719883Skarels /*02*/ char cm_vc[4]; /* returns ASCII version code */ 21819883Skarels /*06*/ u_char cm_cc; /* returns config completion code */ 21919883Skarels /*07*/ u_char cm_opmode; /* specifies operation mode */ 22019883Skarels /*08*/ u_short cm_dfo; /* specifies host data format option */ 22119883Skarels /*10*/ u_char cm_dcn1; /* reserved, must be 1 */ 22219883Skarels /*11*/ u_char cm_2rsrv[2]; /* reserved, must be 0 */ 22319883Skarels /*13*/ u_char cm_ham; /* specifies host address mode */ 22419883Skarels /*14*/ u_char cm_3rsrv; /* reserved, must be 0 */ 22519883Skarels /*15*/ u_char cm_mapsiz; /* reserved, must be 0 */ 22619883Skarels /*16*/ u_char cm_byteptrn[4]; /* host data format option test pattern */ 22719883Skarels /*20*/ u_short cm_wordptrn[2]; 22819883Skarels /*24*/ u_long cm_lwordptrn; 22919883Skarels /*28*/ u_char cm_rsrvd[20]; 23019883Skarels /*48*/ u_long cm_mba; /* use 0xFFFFFFFF in link level mode */ 23119883Skarels /*52*/ u_char cm_nproc; /* use 0xFF in link level mode */ 23219883Skarels /*53*/ u_char cm_nmbox; /* use 0xFF in link level mode */ 23319883Skarels /*54*/ u_char cm_nmcast; /* use 0xFF in link level mode */ 23419883Skarels /*55*/ u_char cm_nhost; /* use 1 in link level mode */ 23519883Skarels 23619883Skarels /* the next five parameters define the request message queue */ 23719883Skarels /*56*/ u_long cm_h2xba; /* base address of message queue */ 23819883Skarels /*60*/ u_short cm_h2xhdr; /* address offset of msg Q header */ 23919883Skarels /*62*/ u_char cm_h2xtyp; /* interrupt type */ 24019883Skarels /*63*/ u_char cm_h2xval; /* interrupt value (not used) */ 24119883Skarels /*64*/ u_short cm_h2xaddr; /* interrupt vector */ 24219883Skarels /*66*/ u_short cm_h2xpad; /* pad out unused portion of vector */ 24319883Skarels 24419883Skarels /* the next five parameters define the reply message queue */ 24519883Skarels /*68*/ u_long cm_x2hba; /* base address of message queue */ 24619883Skarels /*72*/ u_short cm_x2hhdr; /* address offset of msg Q header */ 24719883Skarels /*74*/ u_char cm_x2htyp; /* interrupt type */ 24819883Skarels /*75*/ u_char cm_x2hval; /* interrupt value (not used) */ 24919883Skarels /*76*/ u_short cm_x2haddr; /* interrupt vector */ 25019883Skarels /*78*/ u_short cm_x2hpad; /* pad out unused portion of vector */ 25119883Skarels /*80*/ 25219883Skarels }; 25319883Skarels 254