1: /* 2: * Copyright (c) 1982, 1986 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)if_hy.h 7.1 (Berkeley) 6/5/86 7: */ 8: 9: /* 10: * 4.2 BSD Unix Kernel - Vax Network Interface Support 11: * 12: * $Header: if_hy.h,v 10.0 84/06/30 19:51:21 steveg Stable $ 13: * $Locker: $ 14: * 15: * Modifications from Berkeley 4.2 BSD 16: * Copyright (c) 1983, Tektronix Inc. 17: * All Rights Reserved 18: * 19: * 20: * $Log: if_hy.h,v $ 21: * Revision 10.0 84/06/30 19:51:21 steveg 22: * Big Build 23: * 24: * Revision 3.13 84/05/30 19:40:58 steveg 25: * update hy_stat to reflect new microcode 26: * 27: * Revision 3.12 84/05/30 19:06:57 steveg 28: * move driver state number definition here from if_hy.c 29: * 30: * Revision 3.11 84/05/30 18:56:15 steveg 31: * add definition of HYE_MAX and HYE_SIZE 32: * 33: * Revision 3.10 84/05/30 17:14:04 steveg 34: * add hyl_filter 35: * 36: * Revision 3.9 84/05/30 13:45:24 steveg 37: * rework logging 38: * 39: * Revision 3.8 84/05/04 05:18:59 steveg 40: * hyr_key now a u_long 41: * 42: * Revision 3.7 84/05/01 22:45:20 steveg 43: * add H_RLOOPBK for A710 remote end loopback command 44: * 45: * 46: */ 47: 48: 49: /* 50: * Structure of a HYPERchannel adapter header 51: */ 52: struct hy_hdr { 53: short hyh_ctl; /* control */ 54: short hyh_access; /* access code */ 55: union { 56: short hyh_addr; 57: char hyh_baddr[2]; 58: } hyh_uto, hyh_ufrom; /* to/from address */ 59: short hyh_param; /* parameter word */ 60: short hyh_type; /* record type */ 61: }; 62: 63: 64: #define hyh_to hyh_uto.hyh_addr 65: #define hyh_to_port hyh_uto.hyh_baddr[1] 66: #define hyh_to_adapter hyh_uto.hyh_baddr[0] 67: 68: #define hyh_from hyh_ufrom.hyh_addr 69: #define hyh_from_port hyh_ufrom.hyh_baddr[1] 70: #define hyh_from_adapter hyh_ufrom.hyh_baddr[0] 71: 72: /* 73: * Structure of a HYPERchannel message header (from software) 74: */ 75: struct hym_hdr { 76: struct { 77: short hymd_mplen; /* message proper len, if associated data */ 78: } hym_d; 79: struct hy_hdr hym_h; /* hardware header, MUST BE LAST */ 80: }; 81: 82: #define hym_mplen hym_d.hymd_mplen 83: 84: #define hym_ctl hym_h.hyh_ctl 85: #define hym_access hym_h.hyh_access 86: #define hym_param hym_h.hyh_param 87: #define hym_type hym_h.hyh_type 88: 89: #define hym_to hym_h.hyh_to 90: #define hym_to_port hym_h.hyh_to_port 91: #define hym_to_adapter hym_h.hyh_to_adapter 92: 93: #define hym_from hym_h.hyh_from 94: #define hym_from_port hym_h.hyh_from_port 95: #define hym_from_adapter hym_h.hyh_from_adapter 96: 97: #define HYM_SWLEN (sizeof(struct hym_hdr) - sizeof(struct hy_hdr)) 98: 99: /* 100: * HYPERchannel header word control bits 101: */ 102: #define H_XTRUNKS 0x00F0 /* transmit trunks */ 103: #define H_RTRUNKS 0x000F /* remote trunks to transmit on for loopback */ 104: #define H_ASSOC 0x0100 /* has associated data */ 105: #define H_LOOPBK 0x00FF /* loopback command */ 106: #define H_RLOOPBK 0x008F /* A710 remote loopback command */ 107: 108: /* 109: * Hyperchannel record types 110: */ 111: #define HYLINK_IP 0 /* Internet Protocol Packet */ 112: 113: /* 114: * Routing database 115: */ 116: #define HYRSIZE 37 /* max number of adapters in routing tables */ 117: 118: struct hy_route { 119: time_t hyr_lasttime; /* last update time */ 120: u_char hyr_gateway[256]; 121: struct hyr_hash { 122: u_long hyr_key; /* desired address */ 123: u_short hyr_flags; /* status flags - see below */ 124: u_short hyr_size; /* number of entries */ 125: union { 126: /* 127: * direct entry (can get there directly) 128: */ 129: struct { 130: u_short hyru_dst; /* adapter number & port */ 131: u_short hyru_ctl; /* trunks to try */ 132: u_short hyru_access; /* access code (mostly unused) */ 133: } hyr_d; 134: #define hyr_dst hyr_u.hyr_d.hyru_dst 135: #define hyr_ctl hyr_u.hyr_d.hyru_ctl 136: #define hyr_access hyr_u.hyr_d.hyru_access 137: /* 138: * indirect entry (one or more hops required) 139: */ 140: struct { 141: u_char hyru_pgate; /* 1st gateway slot */ 142: u_char hyru_egate; /* # gateways */ 143: u_char hyru_nextgate; /* gateway to use next */ 144: } hyr_i; 145: #define hyr_pgate hyr_u.hyr_i.hyru_pgate 146: #define hyr_egate hyr_u.hyr_i.hyru_egate 147: #define hyr_nextgate hyr_u.hyr_i.hyru_nextgate 148: } hyr_u; 149: } hyr_hash[HYRSIZE]; 150: }; 151: 152: /* 153: * routing table set/get structure 154: * 155: * used to just pass the entire routing table through, but 4.2 ioctls 156: * limit the data part of an ioctl to 128 bytes or so and use the 157: * interface name to get things sent the right place. 158: * see ../net/if.h for additional details. 159: */ 160: struct hyrsetget { 161: char hyrsg_name[IFNAMSIZ]; /* if name, e.g. "hy0" */ 162: struct hy_route *hyrsg_ptr; /* pointer to routing table */ 163: unsigned hyrsg_len; /* size of routing table provided */ 164: }; 165: 166: #define HYR_INUSE 0x01 /* entry in use */ 167: #define HYR_DIR 0x02 /* direct entry */ 168: #define HYR_GATE 0x04 /* gateway entry */ 169: #define HYR_LOOP 0x08 /* hardware loopback entry */ 170: #define HYR_RLOOP 0x10 /* remote adapter hardware loopback entry */ 171: 172: #define HYRHASH(x) (((x) ^ ((x) >> 16)) % HYRSIZE) 173: 174: #define HYSETROUTE _IOW(i, 0x80, struct hyrsetget) 175: #define HYGETROUTE _IOW(i, 0x81, struct hyrsetget) 176: 177: struct hylsetget { 178: char hylsg_name[IFNAMSIZ]; /* if name, e.g. "hy0" */ 179: int hylsg_cmd; /* logging command */ 180: caddr_t hylsg_ptr; /* pointer to table */ 181: u_long hylsg_len; /* size of table provided */ 182: }; 183: 184: #define HYSETLOG _IOW(i, 0x82, struct hylsetget) 185: #define HYGETLOG _IOW(i, 0x83, struct hylsetget) 186: #define HYGETELOG _IOW(i, 0x84, struct hylsetget) 187: 188: /* 189: * Structure of Statistics Record (counters) 190: */ 191: struct hy_stat { 192: u_char hyc_df0[3]; /* # data frames trunk 0 */ 193: u_char hyc_df1[3]; /* # data frames trunk 1 */ 194: u_char hyc_df2[3]; /* # data frames trunk 2 */ 195: u_char hyc_df3[3]; /* # data frames trunk 3 */ 196: u_char hyc_cancel[2]; /* # cancel operations */ 197: u_char hyc_abort[2]; /* # aborts */ 198: u_char hyc_ret0[3]; /* # retransmissions trunk 0 */ 199: u_char hyc_ret1[3]; /* # retransmissions trunk 1 */ 200: u_char hyc_ret2[3]; /* # retransmissions trunk 2 */ 201: u_char hyc_ret3[3]; /* # retransmissions trunk 3 */ 202: u_char hyc_atype[3]; /* adapter type and revision level */ 203: u_char hyc_uaddr; /* adapter unit number */ 204: }; 205: 206: /* 207: * Structure of the Status Record 208: */ 209: struct hy_status { 210: u_char hys_gen_status; /* general status byte */ 211: u_char hys_last_fcn; /* last function code issued */ 212: u_char hys_resp_trunk; /* trunk response byte */ 213: u_char hys_status_trunk; /* trunk status byte */ 214: u_char hys_recd_resp; /* recieved response byte */ 215: u_char hys_error; /* error code */ 216: u_char hys_caddr; /* compressed addr of 1st msg on chain */ 217: u_char hys_pad; /* not used */ 218: }; 219: 220: /* 221: * Get port number from status record 222: */ 223: #define PORTNUM(p) (((p)->hys_gen_status >> 6) & 0x03) 224: 225: #define HYL_SIZE 16*1024 226: struct hy_log { 227: struct hy_log *hyl_self; 228: u_char hyl_enable; /* logging enabled? */ 229: u_char hyl_onerr; /* state to enter on error */ 230: u_short hyl_wait; /* number of bytes till next wakeup */ 231: u_short hyl_count; /* number of samples till stop */ 232: u_short hyl_icount; /* initial value of hyl_count */ 233: u_long hyl_filter; /* log items with specific bits set */ 234: u_char *hyl_eptr; /* &hy_log.hyl_buf[HYL_SIZE] */ 235: u_char *hyl_ptr; /* pointer into hyl_buf */ 236: u_char hyl_buf[HYL_SIZE]; /* log buffer space */ 237: }; 238: 239: #define HYL_NOP 0 240: #define HYL_UP 1 /* markup */ 241: #define HYL_STATUS 2 /* status results (struct hy_status) */ 242: #define HYL_STATISTICS 3 /* statistics (struct hy_stat) */ 243: #define HYL_XMIT 4 /* packed being send (struct hym_hdr) */ 244: #define HYL_RECV 5 /* recieved pkt (short len; struct hym_hdr) */ 245: #define HYL_CMD 6 /* cmd issued (uchar cmd, state; short count) */ 246: #define HYL_INT 7 /* interrupt (short csr, wcr) */ 247: #define HYL_CANCEL 8 /* cancel transmit attempt */ 248: #define HYL_RESET 9 /* hyinit or unibus reset */ 249: #define HYL_IOCTL 10 /* hyioctl */ 250: 251: #define HYL_DISABLED 0 /* logging disabled */ 252: #define HYL_CONTINUOUS 1 /* continuous logging */ 253: #define HYL_CATCHN 2 /* hyl_count transactions being captured */ 254: 255: /* 256: * error code histograms 257: */ 258: #define HYE_MAX 0x18 /* maximum adapter error code */ 259: #define HYE_BINS 4 /* number of command bins */ 260: #define HYE_SIZE (HYE_MAX+1)*HYE_BINS /* size of histogram buffer */ 261: 262: /* 263: * Requests for service (in order by descending priority). 264: */ 265: #define RQ_ENDOP 001 /* end the last adapter function */ 266: #define RQ_REISSUE 002 /* reissue previous cmd after status */ 267: #define RQ_STATUS 004 /* get the status of the adapter */ 268: #define RQ_STATISTICS 010 /* get the statistics of the adapter */ 269: #define RQ_MARKDOWN 020 /* mark this adapter port down */ 270: #define RQ_MARKUP 040 /* mark this interface up */ 271: 272: #define RQ_XASSOC 0100 /* associated data to transmit */ 273: 274: /* 275: * Driver states. 276: */ 277: #define STARTUP 0 /* initial state (before fully there) */ 278: #define IDLE 1 /* idle state */ 279: #define STATSENT 2 /* status cmd sent to adapter */ 280: #define ENDOPSENT 3 /* end operation cmd sent */ 281: #define RECVSENT 4 /* input message cmd sent */ 282: #define RECVDATASENT 5 /* input data cmd sent */ 283: #define XMITSENT 6 /* transmit message cmd sent */ 284: #define XMITDATASENT 7 /* transmit data cmd sent */ 285: #define WAITING 8 /* waiting for messages */ 286: #define CLEARSENT 9 /* clear wait for message cmd sent */ 287: #define MARKPORT 10 /* mark this host's adapter port down issued */ 288: #define RSTATSENT 11 /* read statistics cmd sent to adapter */ 289: 290: #ifdef HYLOG 291: char *hy_state_names[] = { 292: "Startup", 293: "Idle", 294: "Status Sent", 295: "End op Sent", 296: "Recieve Message Proper Sent", 297: "Recieve Data Sent", 298: "Transmit Message Proper Sent", 299: "Transmit Data Sent", 300: "Wait for Message Sent", 301: "Clear Wait for Message Sent", 302: "Mark Port Down Sent", 303: "Read Statistics Sent" 304: }; 305: #endif