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