Annotation of 42BSD/sys/vaxif/if_hyreg.h, revision 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.