Annotation of 42BSD/sys/vaxif/if_hyreg.h, revision 1.1.1.1

1.1       root        1: /*     if_hyreg.h      6.1     83/07/29        */
                      2: 
                      3: /*
                      4:  * Network Systems Corporation Hyperchannel interface
                      5:  *
                      6:  * supports A410 adapter interfaced via a DEC DR-11B, NSC PI-13 or PI-14
                      7:  *     (PI-14 is a PI-13 with different line drivers, software is
                      8:  *     identical to a PI-13)
                      9:  *
                     10:  * Written by Steve Glaser, Tektronix Inc., July 1982
                     11:  *
                     12:  * NOTE:
                     13:  *
                     14:  * DR11B code has not been fully checked out with 4.1a.
                     15:  * The first adapters at Tek came with DR11Bs, and the code once worked,
                     16:  * but those have been upgraded to PI-13s.
                     17:  */
                     18: #define        PI13    1       /* PI13 vs. DR11B device depandant code */
                     19: #ifndef HYLOG
                     20: #define HYLOG  1       /* enable logging of errors */
                     21: #endif
                     22: 
                     23: /*
                     24:  * Structure of a HYPERchannel adapter header
                     25:  */
                     26: struct hy_hdr {
                     27:        short   hyh_ctl;        /* control */
                     28:        short   hyh_access;     /* access code */
                     29:        union {                 /* to/from addresses */
                     30:                short   hyh_addr;       /* full address */
                     31:                char    hyh_baddr[2];   /* adapter/port number from address */
                     32:        } hyhu_to, hyhu_from;
                     33: #define        hyh_to          hyhu_to.hyh_addr
                     34: #define        hyh_from        hyhu_from.hyh_addr
                     35: #define        hyh_to_adapter  hyhu_to.hyh_baddr[0]
                     36: #define        hyh_to_port     hyhu_to.hyh_baddr[1]
                     37: #define        hyh_from_adapter hyhu_from.hyh_baddr[0]
                     38: #define        hyh_from_port   hyhu_from.hyh_baddr[1]
                     39:        short   hyh_param;      /* parameter (for loopback) */
                     40:        char    hyh_type;       /* record type */
                     41:        char    hyh_off;        /* offset from end of hy_hdr to ip data */
                     42: };
                     43: 
                     44: /*
                     45:  * Structure of a HYPERchannel message header (from software)
                     46:  */
                     47: struct hym_data {
                     48:        short   hymd_mplen;     /* message proper length, if associated data */
                     49: };
                     50: 
                     51: struct hym_hdr {
                     52:        struct  hym_data hym_d;
                     53: #define hym_mplen hym_d.hymd_mplen
                     54:        struct  hy_hdr hym_hdr; /* hardware header, MUST BE LAST */
                     55: };
                     56: 
                     57: /*
                     58:  * HYPERchannel header word control bits
                     59:  */
                     60: #define        H_XTRUNKS       0x00F0  /* transmit trunks */
                     61: #define H_RTRUNKS      0x000F  /* remote trunks to transmit on for loopback */
                     62: #define H_ASSOC                0x0100  /* has associated data */
                     63: #define H_LOOPBK       0x00FF  /* loopback command */
                     64: 
                     65: /*
                     66:  * Structure of Statistics Record (counters)
                     67:  */
                     68: struct hy_stat {
                     69:        u_long  hyc_msgcnt;             /* # messages transmitted */
                     70:        u_long  hyc_dbcnt;              /* # data buffers transmitted */
                     71:        u_long  hyc_tbusy;              /* # available trunks busy */
                     72:        u_long  hyc_hwret;              /* # hardware retransmits */
                     73:        u_long  hyc_crcbad;             /* # crc errors on trunk */
                     74:        u_long  hyc_mcret;              /* # microcode retransmits */
                     75:        u_long  hyc_tdabort;            /* # trunk driver aborts */
                     76:        u_char  hyc_atype[3];           /* adapter type and revision level */
                     77:        u_char  hyc_uaddr;              /* adapter unit number */
                     78: };
                     79: 
                     80: /*
                     81:  * Structure of the Status Record
                     82:  */
                     83: struct hy_status {
                     84:        u_char  hys_gen_status;         /* general status byte */
                     85:        u_char  hys_last_fcn;           /* last function code issued */
                     86:        u_char  hys_resp_trunk;         /* trunk response byte */
                     87:        u_char  hys_status_trunk;       /* trunk status byte */
                     88:        u_char  hys_recd_resp;          /* recieved response byte */
                     89:        u_char  hys_error;              /* error code */
                     90:        u_char  hys_caddr;              /* compressed addr of 1st msg on chain */
                     91:        u_char  hys_pad;                /* not used */
                     92: };
                     93: 
                     94: /*
                     95:  * Get port number from status record
                     96:  */
                     97: #define PORTNUM(p)     (((p)->hys_gen_status >> 6) & 0x03)
                     98: 
                     99: /*
                    100:  * The HYPERchannel driver sends and receives messages formatted:
                    101:  *
                    102:  *     +---------------------------------------+       ---
                    103:  *     |                                       |       /|\
                    104:  *     |  HYPERchannel adapter header (hy_hdr) |        |
                    105:  *     |                                       |        |
                    106:  *     +---------------------------------------+        |
                    107:  *     |                                       |        |
                    108:  *     |     Internet Protocol header (ip)     |    message proper
                    109:  *     |                                       |    (64 bytes max)
                    110:  *     +---------------------------------------+        |
                    111:  *     |                                       |        |
                    112:  *     |       TCP header + user data          |        |
                    113:  *     |       (if it all fits here)           |        |
                    114:  *     |                                       |       \|/
                    115:  *     +---------------------------------------+       ---
                    116:  *
                    117:  *     +---------------------------------------+       ---
                    118:  *     |                                       |       /|\
                    119:  *     |                                       |        |
                    120:  *     |       TCP header + user data          |  associated data
                    121:  *     |                                       |        |
                    122:  *     |                                       |       \|/
                    123:  *     +---------------------------------------+       ---
                    124:  *
                    125:  * If all of the datagram will fit in the message proper (including
                    126:  * the TCP header and user data) the entire datagram is passed in
                    127:  * the message proper and the associated data feature of the HYPERchannel
                    128:  * is not used.
                    129:  *
                    130:  * The mapping from internet addresses to HYPERchannel addresses is:
                    131:  *
                    132:  *      0       7 8      15 16                   31
                    133:  *     +---------+---------+-----------------------+
                    134:  *     | network | special | HYPERchannel address  |
                    135:  *     +---------+---------+-----------------------+
                    136:  *
                    137:  *     |<------------ internet address ----------->|
                    138:  *
                    139:  * The hyperchannel address is decoded as follows:
                    140:  *
                    141:  *       0                 7 8             13 14  15
                    142:  *     +-------------------+----------------+------+
                    143:  *     |   adapter number  |      zero      | port |
                    144:  *     +-------------------+----------------+------+
                    145:  *
                    146:  * The low 2 bits are port number (interpreted by hyperchannel hardware).
                    147:  *
                    148:  * The encoding of special bits is:
                    149:  *
                    150:  *     00      normal packet
                    151:  *
                    152:  *     01      loop this packet back to the sender at the
                    153:  *             specified adapter (ip header source/destination addresses
                    154:  *             swapped before sending, command bits added to tell the
                    155:  *             remote HYPERchannel adapter debug & performance studies]
                    156:  *             this code acts like 02 (below) if the ip destination (before
                    157:  *             any swapping) and the destination address don't match (e.g.
                    158:  *             this packet is being routed through a gateway)
                    159:  *
                    160:  *     02      loop this packet back to the sender at the
                    161:  *             specified adapter, but go through the specified adapter's
                    162:  *             IP.  This is for testing IP's store and forward mechanism.
                    163:  *
                    164:  *     other   undefined, currently treated as normal packet
                    165:  *
                    166:  */
                    167: #define MPSIZE         64      /* "Message Proper" size */
                    168: #define MAXRETRY       4
                    169: 
                    170: /*
                    171:  * Device registers
                    172:  */
                    173: struct hydevice {
                    174:        short   hyd_wcr;        /* word count (negated) */
                    175:        u_short hyd_bar;        /* bus address bits 15-0 */
                    176:        u_short hyd_csr;        /* control and status */
                    177:        u_short hyd_dbuf;       /* data buffer */
                    178: };
                    179: 
                    180: /*
                    181:  * CSR bit layout
                    182:  */
                    183: #define        S_ERROR    0100000      /* error */
                    184: #define        S_NEX      0040000      /* non-existent memory error */
                    185: #define        S_ATTN     0020000      /* attn (always zero) */
                    186: #ifdef PI13
                    187: #define S_STKINTR  0010000     /* stacked interrupt */
                    188: #else
                    189: #define        S_MAINT    0010000      /* maintenance (not used) */
                    190: #endif
                    191: #define        S_A        0004000      /* device status A (recieve data available) */
                    192: #define        S_B        0002000      /* device status B (normal termination) */
                    193: #define        S_C        0001000      /* device status C (abnormal termination) */
                    194: #ifdef PI13
                    195: #define S_POWEROFF 0000400     /* power off indicator */
                    196: #else
                    197: #define        S_CYCLE    0000400      /* cycle (not used) */
                    198: #endif
                    199: #define        S_READY    0000200      /* ready */
                    200: #define        S_IE       0000100      /* interrupt enable */
                    201: #define        S_XBA      0000060      /* bus address bit bits 17 and 16 */
                    202: #define S_CLRINT   0000014     /* clear stacked interrupt */
                    203: #define        S_IATTN    0000010      /* interrupt on attention only */
                    204: #define S_WC       0000004     /* interrupt on word count == 0 only */
                    205: #define S_IATTNWC  0000000     /* interrupt on word count == 0 and attention */
                    206: #define        S_BURST    0000002      /* burst mode DMA (not used) */
                    207: #define        S_GO       0000001      /* go */
                    208: 
                    209: #define XBASHIFT       12
                    210: 
                    211: #define HY_CSR_BITS "\20\20ERROR\17NEX\16ATTN\15STKINTR\14RECV_DATA\13NORMAL\12ABNORMAL\11POWER\10READY\07IENABLE\06XBA17\05XBA16\04IATTN\03IWC\02BURST\01GO"
                    212: 
                    213: /*
                    214:  * PI13 status conditions
                    215:  */
                    216: #define        HYS_RECVDATA(x) (((x)->hyd_csr & S_A) != 0)     /* get adapter data */
                    217: #define        HYS_NORMAL(x)   (((x)->hyd_csr & S_B) != 0)     /* done normally */
                    218: #define        HYS_ABNORMAL(x) (((x)->hyd_csr & S_C) != 0)     /* done abnormally */
                    219: #define        HYS_ERROR(x)    (((x)->hyd_csr & S_ERROR) != 0) /* error condition */
                    220: #define        HYS_DONE(x)     (((x)->hyd_csr & (S_ERROR|S_B|S_C)) != 0)
                    221: 
                    222: /*
                    223:  * Function Codes for the Hyperchannel Adapter
                    224:  * The codes are offset so they can be "or"ed into
                    225:  * the reg data buffer
                    226:  */
                    227: #define        HYF_XMITMSG     0x04    /* transmit message */
                    228: #define        HYF_XMITDATA    0x08    /* transmit associated data */
                    229: #define        HYF_XMITLSTDATA 0x0C    /* transmit last associated data */
                    230: #define        HYF_XMITLOCMSG  0x10    /* transmit local message */
                    231: #define        HYF_INPUTMSG    0x24    /* input message proper */
                    232: #define        HYF_INPUTDATA   0x28    /* input assiciated data */
                    233: #define        HYF_STATUS      0x40    /* request status */
                    234: #define        HYF_DUMPREGS    0x50    /* dump extention registers */
                    235: #define        HYF_MARKP0      0x60    /* mark down port 0 */
                    236: #define        HYF_MARKP1      0x64    /* mark down port 1 */
                    237: #define        HYF_MARKP2      0x68    /* mark down port 2 */
                    238: #define        HYF_MARKP3      0x6C    /* mark down port 3 */
                    239: #define        HYF_MP0RR       0x70    /* mark down port 0 and reroute messages */
                    240: #define        HYF_MP1RR       0x74    /* mark down port 1 and reroute messages */
                    241: #define        HYF_MP2RR       0x78    /* mark down port 2 and reroute messages */
                    242: #define        HYF_MP3RR       0x7C    /* mark down port 3 and reroute messages */
                    243: #define        HYF_RSTATS      0xA0    /* read statistics */
                    244: #define        HYF_RCSTATS     0xA4    /* read and clear statistics */
                    245: #define        HYF_SETTEST     0xC0    /* enable test operations *set test mode) */
                    246: #define        HYF_SADDR_LEN   0xC4    /* test mode: set address and length */
                    247: #define        HYF_WBUFF       0xC8    /* test mode: write buffer */
                    248: #define        HYF_RBUFF       0xCC    /* test mode: read buffer */
                    249: #define HYF_CLRADAPTER 0xE0    /* clear adapter */
                    250: #define        HYF_END_OP      0xE4    /* end operation */
                    251: #define        HYF_CLRWFMSG    0xE6    /* clear wait for mwssage */
                    252: #define        HYF_WAITFORMSG  0xE8    /* wait for message */
                    253: 
                    254: /*
                    255:  * Hyperchannel record types
                    256:  */
                    257: #define        HYLINK_IP       0       /* Internet Protocol Packet */
                    258: 
                    259: #ifdef HYLOG
                    260: #define HYL_SIZE 16*1024
                    261: struct hy_log {
                    262:        struct  hy_log *hyl_self;
                    263:        u_char  hyl_enable;             /* logging enabled? */
                    264:        u_char  hyl_onerr;              /* state to enter on error */
                    265:        u_char  *hyl_eptr;              /* &hy_log.hyl_buf[HYL_SIZE] */
                    266:        u_char  *hyl_ptr;               /* pointer into hyl_buf */
                    267:        u_char  hyl_buf[HYL_SIZE];      /* log buffer space */
                    268: };
                    269: 
                    270: #define HYL_NOP                0
                    271: #define HYL_UP         1       /* markup */
                    272: #define HYL_STATUS     2       /* status results (struct hy_status) */
                    273: #define HYL_STATISTICS 3       /* statistics (struct hy_stat) */
                    274: #define HYL_XMIT       4       /* packed being send (struct hym_hdr) */
                    275: #define HYL_RECV       5       /* recieved packet (short len; struct hy_hdr) */
                    276: #define HYL_CMD                6       /* cmd issued (uchar cmd, state; short count) */
                    277: #define HYL_INT                7       /* interrupt (short csr, wcr) */
                    278: 
                    279: #define HYL_DISABLED   0       /* logging disabled */
                    280: #define HYL_CONTINUOUS 1       /* continuous logging */
                    281: #define HYL_CAUGHT1    2       /* one buffer full captured */
                    282: #define HYL_CATCH1     3       /* one buffer full being captured */
                    283: #define HYL_CAUGHTSTATUS  4    /* one buffer of status captured */
                    284: #define HYL_CATCHSTATUS        5       /* one buffer fill of status being captured */
                    285: 
                    286: #ifdef  KERNEL
                    287: struct hy_log hy_log;
                    288: #endif
                    289: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.