|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.