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