123296Smckusick /* 229282Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 335322Sbostic * All rights reserved. 423296Smckusick * 535322Sbostic * This code is derived from software contributed to Berkeley by 635322Sbostic * Tektronix Inc. 735322Sbostic * 8*44560Sbostic * %sccs.include.redist.c% 935322Sbostic * 10*44560Sbostic * @(#)if_hy.h 7.4 (Berkeley) 06/28/90 1123296Smckusick */ 1211196Ssam 1311196Ssam /* 1421129Skarels * 4.2 BSD Unix Kernel - Vax Network Interface Support 1521129Skarels * 1621129Skarels * $Header: if_hy.h,v 10.0 84/06/30 19:51:21 steveg Stable $ 1721129Skarels * $Locker: $ 1821129Skarels * 1921129Skarels * Modifications from Berkeley 4.2 BSD 2021129Skarels * Copyright (c) 1983, Tektronix Inc. 2121129Skarels * All Rights Reserved 2221129Skarels * 2321129Skarels * 2421129Skarels * $Log: if_hy.h,v $ 2521129Skarels * Revision 10.0 84/06/30 19:51:21 steveg 2621129Skarels * Big Build 2721129Skarels * 2821129Skarels * Revision 3.13 84/05/30 19:40:58 steveg 2921129Skarels * update hy_stat to reflect new microcode 3021129Skarels * 3121129Skarels * Revision 3.12 84/05/30 19:06:57 steveg 3221129Skarels * move driver state number definition here from if_hy.c 3321129Skarels * 3421129Skarels * Revision 3.11 84/05/30 18:56:15 steveg 3521129Skarels * add definition of HYE_MAX and HYE_SIZE 3621129Skarels * 3721129Skarels * Revision 3.10 84/05/30 17:14:04 steveg 3821129Skarels * add hyl_filter 3921129Skarels * 4021129Skarels * Revision 3.9 84/05/30 13:45:24 steveg 4121129Skarels * rework logging 4221129Skarels * 4321129Skarels * Revision 3.8 84/05/04 05:18:59 steveg 4421129Skarels * hyr_key now a u_long 4521129Skarels * 4621129Skarels * Revision 3.7 84/05/01 22:45:20 steveg 4721129Skarels * add H_RLOOPBK for A710 remote end loopback command 4821129Skarels * 4921129Skarels * 5011196Ssam */ 5111196Ssam 5221129Skarels 5321129Skarels /* 5421129Skarels * Structure of a HYPERchannel adapter header 5521129Skarels */ 5621129Skarels struct hy_hdr { 5721129Skarels short hyh_ctl; /* control */ 5821129Skarels short hyh_access; /* access code */ 5921129Skarels union { 6021129Skarels short hyh_addr; 6121129Skarels char hyh_baddr[2]; 6221129Skarels } hyh_uto, hyh_ufrom; /* to/from address */ 6321129Skarels short hyh_param; /* parameter word */ 6421129Skarels short hyh_type; /* record type */ 6521129Skarels }; 6621129Skarels 6721129Skarels 6821129Skarels #define hyh_to hyh_uto.hyh_addr 6921129Skarels #define hyh_to_port hyh_uto.hyh_baddr[1] 7021129Skarels #define hyh_to_adapter hyh_uto.hyh_baddr[0] 7121129Skarels 7221129Skarels #define hyh_from hyh_ufrom.hyh_addr 7321129Skarels #define hyh_from_port hyh_ufrom.hyh_baddr[1] 7421129Skarels #define hyh_from_adapter hyh_ufrom.hyh_baddr[0] 7521129Skarels 7621129Skarels /* 7721129Skarels * Structure of a HYPERchannel message header (from software) 7821129Skarels */ 7921129Skarels struct hym_hdr { 8021129Skarels struct { 8121129Skarels short hymd_mplen; /* message proper len, if associated data */ 8221129Skarels } hym_d; 8321129Skarels struct hy_hdr hym_h; /* hardware header, MUST BE LAST */ 8421129Skarels }; 8521129Skarels 8621129Skarels #define hym_mplen hym_d.hymd_mplen 8721129Skarels 8821129Skarels #define hym_ctl hym_h.hyh_ctl 8921129Skarels #define hym_access hym_h.hyh_access 9021129Skarels #define hym_param hym_h.hyh_param 9121129Skarels #define hym_type hym_h.hyh_type 9221129Skarels 9321129Skarels #define hym_to hym_h.hyh_to 9421129Skarels #define hym_to_port hym_h.hyh_to_port 9521129Skarels #define hym_to_adapter hym_h.hyh_to_adapter 9621129Skarels 9721129Skarels #define hym_from hym_h.hyh_from 9821129Skarels #define hym_from_port hym_h.hyh_from_port 9921129Skarels #define hym_from_adapter hym_h.hyh_from_adapter 10021129Skarels 10121129Skarels #define HYM_SWLEN (sizeof(struct hym_hdr) - sizeof(struct hy_hdr)) 10221129Skarels 10321129Skarels /* 10421129Skarels * HYPERchannel header word control bits 10521129Skarels */ 10621129Skarels #define H_XTRUNKS 0x00F0 /* transmit trunks */ 10721129Skarels #define H_RTRUNKS 0x000F /* remote trunks to transmit on for loopback */ 10821129Skarels #define H_ASSOC 0x0100 /* has associated data */ 10921129Skarels #define H_LOOPBK 0x00FF /* loopback command */ 11021129Skarels #define H_RLOOPBK 0x008F /* A710 remote loopback command */ 11121129Skarels 11221129Skarels /* 11321129Skarels * Hyperchannel record types 11421129Skarels */ 11521129Skarels #define HYLINK_IP 0 /* Internet Protocol Packet */ 11621129Skarels 11721129Skarels /* 11821129Skarels * Routing database 11921129Skarels */ 12011196Ssam #define HYRSIZE 37 /* max number of adapters in routing tables */ 12111196Ssam 12221129Skarels struct hy_route { 12321129Skarels time_t hyr_lasttime; /* last update time */ 12421129Skarels u_char hyr_gateway[256]; 12521129Skarels struct hyr_hash { 12621129Skarels u_long hyr_key; /* desired address */ 12711196Ssam u_short hyr_flags; /* status flags - see below */ 12821129Skarels u_short hyr_size; /* number of entries */ 12911196Ssam union { 13011196Ssam /* 13111196Ssam * direct entry (can get there directly) 13211196Ssam */ 13311196Ssam struct { 13421129Skarels u_short hyru_dst; /* adapter number & port */ 13521129Skarels u_short hyru_ctl; /* trunks to try */ 13611196Ssam u_short hyru_access; /* access code (mostly unused) */ 13711196Ssam } hyr_d; 13821129Skarels #define hyr_dst hyr_u.hyr_d.hyru_dst 13921129Skarels #define hyr_ctl hyr_u.hyr_d.hyru_ctl 14021129Skarels #define hyr_access hyr_u.hyr_d.hyru_access 14111196Ssam /* 14211196Ssam * indirect entry (one or more hops required) 14311196Ssam */ 14411196Ssam struct { 14511196Ssam u_char hyru_pgate; /* 1st gateway slot */ 14611196Ssam u_char hyru_egate; /* # gateways */ 14711196Ssam u_char hyru_nextgate; /* gateway to use next */ 14811196Ssam } hyr_i; 14921129Skarels #define hyr_pgate hyr_u.hyr_i.hyru_pgate 15021129Skarels #define hyr_egate hyr_u.hyr_i.hyru_egate 15121129Skarels #define hyr_nextgate hyr_u.hyr_i.hyru_nextgate 15211196Ssam } hyr_u; 15311196Ssam } hyr_hash[HYRSIZE]; 15411196Ssam }; 15511196Ssam 15621129Skarels /* 15721129Skarels * routing table set/get structure 15821129Skarels * 15921129Skarels * used to just pass the entire routing table through, but 4.2 ioctls 16021129Skarels * limit the data part of an ioctl to 128 bytes or so and use the 16121129Skarels * interface name to get things sent the right place. 16221129Skarels * see ../net/if.h for additional details. 16321129Skarels */ 16421129Skarels struct hyrsetget { 16521129Skarels char hyrsg_name[IFNAMSIZ]; /* if name, e.g. "hy0" */ 16621129Skarels struct hy_route *hyrsg_ptr; /* pointer to routing table */ 16721129Skarels unsigned hyrsg_len; /* size of routing table provided */ 16821129Skarels }; 16911196Ssam 17011196Ssam #define HYR_INUSE 0x01 /* entry in use */ 17111196Ssam #define HYR_DIR 0x02 /* direct entry */ 17211196Ssam #define HYR_GATE 0x04 /* gateway entry */ 17321129Skarels #define HYR_LOOP 0x08 /* hardware loopback entry */ 17421129Skarels #define HYR_RLOOP 0x10 /* remote adapter hardware loopback entry */ 17511196Ssam 17611196Ssam #define HYRHASH(x) (((x) ^ ((x) >> 16)) % HYRSIZE) 17711196Ssam 17833099Sbostic #define HYSETROUTE _IOW('i', 0x80, struct hyrsetget) 17933099Sbostic #define HYGETROUTE _IOW('i', 0x81, struct hyrsetget) 18021129Skarels 18121129Skarels struct hylsetget { 18221129Skarels char hylsg_name[IFNAMSIZ]; /* if name, e.g. "hy0" */ 18321129Skarels int hylsg_cmd; /* logging command */ 18421129Skarels caddr_t hylsg_ptr; /* pointer to table */ 18521129Skarels u_long hylsg_len; /* size of table provided */ 18621129Skarels }; 18721129Skarels 18833099Sbostic #define HYSETLOG _IOW('i', 0x82, struct hylsetget) 18933099Sbostic #define HYGETLOG _IOW('i', 0x83, struct hylsetget) 19033099Sbostic #define HYGETELOG _IOW('i', 0x84, struct hylsetget) 19121129Skarels 19221129Skarels /* 19321129Skarels * Structure of Statistics Record (counters) 19421129Skarels */ 19521129Skarels struct hy_stat { 19621129Skarels u_char hyc_df0[3]; /* # data frames trunk 0 */ 19721129Skarels u_char hyc_df1[3]; /* # data frames trunk 1 */ 19821129Skarels u_char hyc_df2[3]; /* # data frames trunk 2 */ 19921129Skarels u_char hyc_df3[3]; /* # data frames trunk 3 */ 20021129Skarels u_char hyc_cancel[2]; /* # cancel operations */ 20121129Skarels u_char hyc_abort[2]; /* # aborts */ 20221129Skarels u_char hyc_ret0[3]; /* # retransmissions trunk 0 */ 20321129Skarels u_char hyc_ret1[3]; /* # retransmissions trunk 1 */ 20421129Skarels u_char hyc_ret2[3]; /* # retransmissions trunk 2 */ 20521129Skarels u_char hyc_ret3[3]; /* # retransmissions trunk 3 */ 20621129Skarels u_char hyc_atype[3]; /* adapter type and revision level */ 20721129Skarels u_char hyc_uaddr; /* adapter unit number */ 20821129Skarels }; 20921129Skarels 21021129Skarels /* 21121129Skarels * Structure of the Status Record 21221129Skarels */ 21321129Skarels struct hy_status { 21421129Skarels u_char hys_gen_status; /* general status byte */ 21521129Skarels u_char hys_last_fcn; /* last function code issued */ 21621129Skarels u_char hys_resp_trunk; /* trunk response byte */ 21721129Skarels u_char hys_status_trunk; /* trunk status byte */ 21821129Skarels u_char hys_recd_resp; /* recieved response byte */ 21921129Skarels u_char hys_error; /* error code */ 22021129Skarels u_char hys_caddr; /* compressed addr of 1st msg on chain */ 22121129Skarels u_char hys_pad; /* not used */ 22221129Skarels }; 22321129Skarels 22421129Skarels /* 22521129Skarels * Get port number from status record 22621129Skarels */ 22721129Skarels #define PORTNUM(p) (((p)->hys_gen_status >> 6) & 0x03) 22821129Skarels 22921129Skarels #define HYL_SIZE 16*1024 23021129Skarels struct hy_log { 23121129Skarels struct hy_log *hyl_self; 23221129Skarels u_char hyl_enable; /* logging enabled? */ 23321129Skarels u_char hyl_onerr; /* state to enter on error */ 23421129Skarels u_short hyl_wait; /* number of bytes till next wakeup */ 23521129Skarels u_short hyl_count; /* number of samples till stop */ 23621129Skarels u_short hyl_icount; /* initial value of hyl_count */ 23721129Skarels u_long hyl_filter; /* log items with specific bits set */ 23821129Skarels u_char *hyl_eptr; /* &hy_log.hyl_buf[HYL_SIZE] */ 23921129Skarels u_char *hyl_ptr; /* pointer into hyl_buf */ 24021129Skarels u_char hyl_buf[HYL_SIZE]; /* log buffer space */ 24121129Skarels }; 24221129Skarels 24321129Skarels #define HYL_NOP 0 24421129Skarels #define HYL_UP 1 /* markup */ 24521129Skarels #define HYL_STATUS 2 /* status results (struct hy_status) */ 24621129Skarels #define HYL_STATISTICS 3 /* statistics (struct hy_stat) */ 24721129Skarels #define HYL_XMIT 4 /* packed being send (struct hym_hdr) */ 24821129Skarels #define HYL_RECV 5 /* recieved pkt (short len; struct hym_hdr) */ 24921129Skarels #define HYL_CMD 6 /* cmd issued (uchar cmd, state; short count) */ 25021129Skarels #define HYL_INT 7 /* interrupt (short csr, wcr) */ 25121129Skarels #define HYL_CANCEL 8 /* cancel transmit attempt */ 25221129Skarels #define HYL_RESET 9 /* hyinit or unibus reset */ 25321129Skarels #define HYL_IOCTL 10 /* hyioctl */ 25421129Skarels 25521129Skarels #define HYL_DISABLED 0 /* logging disabled */ 25621129Skarels #define HYL_CONTINUOUS 1 /* continuous logging */ 25721129Skarels #define HYL_CATCHN 2 /* hyl_count transactions being captured */ 25821129Skarels 25921129Skarels /* 26021129Skarels * error code histograms 26121129Skarels */ 26221129Skarels #define HYE_MAX 0x18 /* maximum adapter error code */ 26321129Skarels #define HYE_BINS 4 /* number of command bins */ 26421129Skarels #define HYE_SIZE (HYE_MAX+1)*HYE_BINS /* size of histogram buffer */ 26521129Skarels 26621129Skarels /* 26721129Skarels * Requests for service (in order by descending priority). 26821129Skarels */ 26921129Skarels #define RQ_ENDOP 001 /* end the last adapter function */ 27021129Skarels #define RQ_REISSUE 002 /* reissue previous cmd after status */ 27121129Skarels #define RQ_STATUS 004 /* get the status of the adapter */ 27221129Skarels #define RQ_STATISTICS 010 /* get the statistics of the adapter */ 27321129Skarels #define RQ_MARKDOWN 020 /* mark this adapter port down */ 27421129Skarels #define RQ_MARKUP 040 /* mark this interface up */ 27521129Skarels 27621129Skarels #define RQ_XASSOC 0100 /* associated data to transmit */ 27721129Skarels 27821129Skarels /* 27921129Skarels * Driver states. 28021129Skarels */ 28121129Skarels #define STARTUP 0 /* initial state (before fully there) */ 28221129Skarels #define IDLE 1 /* idle state */ 28321129Skarels #define STATSENT 2 /* status cmd sent to adapter */ 28421129Skarels #define ENDOPSENT 3 /* end operation cmd sent */ 28521129Skarels #define RECVSENT 4 /* input message cmd sent */ 28621129Skarels #define RECVDATASENT 5 /* input data cmd sent */ 28721129Skarels #define XMITSENT 6 /* transmit message cmd sent */ 28821129Skarels #define XMITDATASENT 7 /* transmit data cmd sent */ 28921129Skarels #define WAITING 8 /* waiting for messages */ 29021129Skarels #define CLEARSENT 9 /* clear wait for message cmd sent */ 29121129Skarels #define MARKPORT 10 /* mark this host's adapter port down issued */ 29221129Skarels #define RSTATSENT 11 /* read statistics cmd sent to adapter */ 29321129Skarels 29421129Skarels #ifdef HYLOG 29521129Skarels char *hy_state_names[] = { 29621129Skarels "Startup", 29721129Skarels "Idle", 29821129Skarels "Status Sent", 29921129Skarels "End op Sent", 30021129Skarels "Recieve Message Proper Sent", 30121129Skarels "Recieve Data Sent", 30221129Skarels "Transmit Message Proper Sent", 30321129Skarels "Transmit Data Sent", 30421129Skarels "Wait for Message Sent", 30521129Skarels "Clear Wait for Message Sent", 30621129Skarels "Mark Port Down Sent", 30721129Skarels "Read Statistics Sent" 30821129Skarels }; 30921129Skarels #endif 31021129Skarels 311