home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tahoe / if / if_exreg.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-08  |  11.5 KB  |  277 lines

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