1 /* 2 * Copyright (c) 1988 Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Tektronix Inc. 7 * 8 * %sccs.include.redist.c% 9 * 10 * @(#)if_hyreg.h 7.3 (Berkeley) 06/28/90 11 */ 12 13 /* 14 * Modifications from Berkeley 4.2 BSD 15 * Copyright (c) 1983, Tektronix Inc. 16 * All Rights Reserved 17 */ 18 19 /* 20 * Network Systems Corporation Hyperchannel interface 21 * 22 * supports A410 adapter interfaced via a DEC DR-11B, NSC PI-13 or PI-14 23 * (PI-14 is a PI-13 with different line drivers, software is 24 * identical to a PI-13) 25 * 26 * Written by Steve Glaser, Tektronix Inc., July 1982 27 * 28 * NOTE: 29 * 30 * DR11B code has not been fully checked out with 4.1a. 31 * The first adapters at Tek came with DR11Bs, and the code once worked, 32 * but those have been upgraded to PI-13s. 33 */ 34 35 /* 36 * The HYPERchannel driver sends and receives messages formatted: 37 * 38 * +---------------------------------------+ --- 39 * | | /|\ 40 * | HYPERchannel adapter header (hy_hdr) | | 41 * | | | 42 * +---------------------------------------+ | 43 * | | | 44 * | Internet Protocol header (ip) | message proper 45 * | | (64 bytes max) 46 * +---------------------------------------+ | 47 * | | | 48 * | TCP header + user data | | 49 * | (if it all fits here) | | 50 * | | \|/ 51 * +---------------------------------------+ --- 52 * 53 * +---------------------------------------+ --- 54 * | | /|\ 55 * | | | 56 * | TCP header + user data | associated data 57 * | | | 58 * | | \|/ 59 * +---------------------------------------+ --- 60 * 61 * If all of the datagram will fit in the message proper (including 62 * the TCP header and user data) the entire datagram is passed in 63 * the message proper and the associated data feature of the HYPERchannel 64 * is not used. 65 * 66 * The mapping from internet addresses to HYPERchannel addresses is: 67 * 68 * 0 7 8 15 16 31 69 * +---------+---------+-----------------------+ 70 * | network | special | HYPERchannel address | 71 * +---------+---------+-----------------------+ 72 * 73 * |<------------ internet address ----------->| 74 * 75 * The hyperchannel address is decoded as follows: 76 * 77 * 0 7 8 13 14 15 78 * +-------------------+----------------+------+ 79 * | adapter number | zero | port | 80 * +-------------------+----------------+------+ 81 * 82 * The low 2 bits are port number (interpreted by hyperchannel hardware). 83 * 84 * The encoding of special bits is: 85 * 86 * 00 normal packet 87 * 88 * 01 loop this packet back to the sender at the 89 * specified adapter (ip header source/destination addresses 90 * swapped before sending, command bits added to tell the 91 * remote HYPERchannel adapter debug & performance studies] 92 * this code acts like 02 (below) if the ip destination (before 93 * any swapping) and the destination address don't match (e.g. 94 * this packet is being routed through a gateway) 95 * 96 * 02 loop this packet back to the sender at the 97 * specified adapter, but go through the specified adapter's 98 * IP. This is for testing IP's store and forward mechanism. 99 * 100 * other undefined, currently treated as normal packet 101 * 102 */ 103 #define MPSIZE 64 /* "Message Proper" size */ 104 #define MAXRETRY 4 105 106 /* 107 * Device registers 108 */ 109 struct hydevice { 110 short hyd_wcr; /* word count (negated) */ 111 u_short hyd_bar; /* bus address bits 15-0 */ 112 u_short hyd_csr; /* control and status */ 113 u_short hyd_dbuf; /* data buffer */ 114 }; 115 116 /* 117 * CSR bit layout 118 */ 119 #define S_ERROR 0100000 /* error */ 120 #define S_NEX 0040000 /* non-existent memory error */ 121 #define S_ATTN 0020000 /* attn (always zero) */ 122 #ifdef PI13 123 #define S_STKINTR 0010000 /* stacked interrupt */ 124 #else 125 #define S_MAINT 0010000 /* maintenance (not used) */ 126 #endif 127 #define S_A 0004000 /* device status A (recieve data available) */ 128 #define S_B 0002000 /* device status B (normal termination) */ 129 #define S_C 0001000 /* device status C (abnormal termination) */ 130 #ifdef PI13 131 #define S_POWEROFF 0000400 /* power off indicator */ 132 #else 133 #define S_CYCLE 0000400 /* cycle (not used) */ 134 #endif 135 #define S_READY 0000200 /* ready */ 136 #define S_IE 0000100 /* interrupt enable */ 137 #define S_XBA 0000060 /* bus address bit bits 17 and 16 */ 138 #define S_CLRINT 0000014 /* clear stacked interrupt */ 139 #define S_IATTN 0000010 /* interrupt on attention only */ 140 #define S_WC 0000004 /* interrupt on word count == 0 only */ 141 #define S_IATTNWC 0000000 /* interrupt on word count == 0 and attention */ 142 #define S_BURST 0000002 /* burst mode DMA (not used) */ 143 #define S_GO 0000001 /* go */ 144 145 #define XBASHIFT 12 146 147 #define HY_CSR_BITS "\20\ 148 \20ERROR\17NEX\16ATTN\15STKINTR\14RECV_DATA\13NORMAL\12ABNORMAL\11POWER\ 149 \10READY\07IENABLE\06XBA17\05XBA16\04IATTN\03IWC\02BURST\01GO" 150 151 /* 152 * PI13 status conditions 153 */ 154 #define HYS_RECVDATA(x) (((x)->hyd_csr & S_A) != 0) /* get adapter data */ 155 #define HYS_NORMAL(x) (((x)->hyd_csr & S_B) != 0) /* done normally */ 156 #define HYS_ABNORMAL(x) (((x)->hyd_csr & S_C) != 0) /* done abnormally */ 157 #define HYS_ERROR(x) (((x)->hyd_csr & S_ERROR) != 0) /* error condition */ 158 #define HYS_DONE(x) (((x)->hyd_csr & (S_ERROR|S_B|S_C)) != 0) 159 160 /* 161 * Function Codes for the Hyperchannel Adapter 162 * The codes are offset so they can be "or"ed into 163 * the reg data buffer 164 */ 165 #define HYF_XMITMSG 0x04 /* transmit message */ 166 #define HYF_XMITDATA 0x08 /* transmit associated data */ 167 #define HYF_XMITLSTDATA 0x0C /* transmit last associated data */ 168 #define HYF_XMITLOCMSG 0x10 /* transmit local message */ 169 #define HYF_INPUTMSG 0x24 /* input message proper */ 170 #define HYF_INPUTDATA 0x28 /* input assiciated data */ 171 #define HYF_STATUS 0x40 /* request status */ 172 #define HYF_DUMPREGS 0x50 /* dump extention registers */ 173 #define HYF_MARKP0 0x60 /* mark down port 0 */ 174 #define HYF_MARKP1 0x64 /* mark down port 1 */ 175 #define HYF_MARKP2 0x68 /* mark down port 2 */ 176 #define HYF_MARKP3 0x6C /* mark down port 3 */ 177 #define HYF_MP0RR 0x70 /* mark down port 0 and reroute messages */ 178 #define HYF_MP1RR 0x74 /* mark down port 1 and reroute messages */ 179 #define HYF_MP2RR 0x78 /* mark down port 2 and reroute messages */ 180 #define HYF_MP3RR 0x7C /* mark down port 3 and reroute messages */ 181 #define HYF_RSTATS 0xA0 /* read statistics */ 182 #define HYF_RCSTATS 0xA4 /* read and clear statistics */ 183 #define HYF_SETTEST 0xC0 /* enable test operations *set test mode) */ 184 #define HYF_SADDR_LEN 0xC4 /* test mode: set address and length */ 185 #define HYF_WBUFF 0xC8 /* test mode: write buffer */ 186 #define HYF_RBUFF 0xCC /* test mode: read buffer */ 187 #define HYF_CLRADAPTER 0xE0 /* clear adapter */ 188 #define HYF_END_OP 0xE4 /* end operation */ 189 #define HYF_CLRWFMSG 0xE6 /* clear wait for mwssage */ 190 #define HYF_WAITFORMSG 0xE8 /* wait for message */ 191