|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 7342 (0x1cae) Types: TextFile Names: »ie.h«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦3b20aab50⟧ »EurOpenD3/network/snmp/kip-snmp.91.tar.Z« └─⟦b503a39fe⟧ └─⟦this⟧ »kip/ie.h«
/* * Intel 82586 registers and structures. * * (c) 1984, Stanford Univ. SUMEX project. * May be used but not sold without permission. * * (c) 1986, Kinetics, Inc. * May be used but not sold without permission. * */ /* * Byte Swapping explained: * When data is accessed a character at a time there is no * problem, but when data is accessed as a short (2 bytes) * or a long (4 bytes), the 68000 and the i82586 have * different ways of ordering the bytes. The 68000 accesses * the most significant byte as the even address and the * i82586 accesses the least significant byte as the even * address. Therefore, every read/write of shorts and longs * must be reversed end-to-end by the 68000. All this boils * down to the point that the following structure declarations * look just like the way they are documented in the Intel manuals, * but because those structures contain 16- and 32-bit fields, * conversion must be done by the 68000 on all read/writes to * those fields. This way data is always correct for the i82596. * When OR'ing and AND'ing, don't forget that the data in the * structures is already "swapped" as it were. */ /* * buffer descriptor. */ struct bd { u_short bd_count; /* data count */ u_short bd_next; /* link to next */ u_short bd_buf; /* buffer pointer */ u_short bd_bufhi; u_short bd_size; /* buffer size (rbd only) */ }; /* bd_count */ #define BD_EOF 0x8000 /* end of frame */ #define BD_F 0x4000 /* filled by 82586 */ #define BD_COUNT 0x3FFF /* count field */ /* bd_size */ #define BD_EL 0x8000 /* end of list */ /* * transmit buffer */ struct t_bd { struct bd tbd; /* the buffer descriptor */ struct pbuf *tpbuf; /* address of the pbuf used for transmit data */ }; /* * receive buffer */ struct r_bd { struct bd rbd; /* the buffer descriptor */ struct pbuf *rpbuf; /* address of the pbuf used for receive data */ }; /* * Command block / receive frame descriptor. */ struct cb { u_short cb_status; /* status */ u_short cb_cmd; /* command */ u_short cb_link; /* link to next */ u_short cb_param[6]; /* different parameters here */ }; /* cb_status */ #define CB_COMPLETE 0x8000 /* complete */ #define CB_BUSY 0x4000 /* busy */ #define CB_OK 0x2000 /* ok */ #define CB_ABORT 0x1000 /* aborted */ /* cb_cmd */ #define CB_EL 0x8000 /* end of list */ #define CB_S 0x4000 /* suspend */ #define CB_I 0x2000 /* hardware interrupt when done */ /* cb_link */ #define CB_NIL 0xffff /* empty pointer */ /* action commands */ #define CBC_NOP 0 /* no operation */ #define CBC_IASETUP 1 /* individual address setup */ #define CBC_CONFIG 2 /* configure */ #define CBC_MULTICAST 3 /* Set multicast address(es) */ #define CBC_TRANS 4 /* transmit */ #define CBC_TDR 5 /* Time Domain Reflectometer */ #define CBC_DUMP 6 /* dump internal regs */ #define CBC_DIAGNOSE 7 /* Diagnose */ /* * frame descriptor structure */ struct fdes { u_short fd_status; /* status */ u_short fd_stat2; /* 2 more stat bits */ u_short fd_link; /* link offset */ u_short fd_rbd; /* rbd offset */ u_char fd_daddr[6]; /* destination address */ u_char fd_saddr[6]; /* source address */ u_short fd_type; /* type field of received frame */ }; /* fd_status */ #define FD_C 0x8000 /* complete */ #define FD_B 0x4000 /* busy */ #define FD_OK 0x2000 /* frame completed ok */ /* fd_stat2 */ #define FD_EL 0x8000 /* end of list */ #define FD_S 0x4000 /* suspend after receive */ /* fd_rbd */ #define FD_NIL 0xffff /* empty pointer */ /* * System control block, plus some driver static structures. */ struct scb { u_short sc_status; /* status */ u_short sc_cmd; /* command */ u_short sc_clist; /* command list */ u_short sc_rlist; /* receive frame list */ u_short sc_crcerrs; /* crc errors */ u_short sc_alnerrs; /* alignment errors */ u_short sc_rscerrs; /* resource errors (lack of rfd/rbd's) */ u_short sc_ovrnerrs; /* overrun errors (mem bus not avail) */ }; /* sc_status bits set by 82586 */ #define STAT_CX 0x8000 /* command executed */ #define STAT_FR 0x4000 /* frame received */ #define STAT_CNA 0x2000 /* cmd unit went active */ #define STAT_RNR 0x1000 /* rec unit left ready */ #define STAT_IDLE 0x0000 /* no status bits */ /* sc_cmd bits ack'd by CPU */ #define ACK_CX 0x8000 /* command executed */ #define ACK_FR 0x4000 /* frame received */ #define ACK_CNA 0x2000 /* cmd unit went active */ #define ACK_RNR 0x1000 /* rec unit left ready */ #define ACK_NONE 0x0000 /* no status bits */ /* command unit status */ #define CUS_IDLE 0x000 /* idle */ #define CUS_SUSP 0x100 /* suspended */ #define CUS_ACTIVE 0x200 /* ready */ #define SC_CUS 0x700 /* command unit status field */ /* receive unit status */ #define RUS_IDLE 0x0 /* idle */ #define RUS_SUSP 0x10 /* suspended */ #define RUS_NORES 0x20 /* no resources */ #define RUS_READY 0x40 /* ready */ #define SC_RUS 0x70 /* receive unit status field */ /* command unit commands */ #define CUC_NOP 0x000 /* nop */ #define CUC_START 0x100 /* start */ #define CUC_RES 0x200 /* resume */ #define CUC_SUSP 0x300 /* suspend */ #define CUC_ABORT 0x400 /* abort */ /* receive unit commands */ #define RUC_NOP 0x00 /* nop */ #define RUC_START 0x10 /* start */ #define RUC_RES 0x20 /* resume */ #define RUC_SUSP 0x30 /* suspend */ #define RUC_ABORT 0x40 /* abort */ /* odd man out */ #define SC_RESET 0x0080 /* software reset */ /* * intermediate system configuration pointer */ struct iscp { u_char is_busy; /* lo order byte is busy byte */ u_char is_test; /* byte used in testing */ u_short is_scb_off; /* lo order 16 bits of scb address */ /* base for scb and all other types of blocks */ u_short is_lo_scb_base; /* lo order 16 bits of scb base */ u_short is_hi_scb_base; /* hi order 8 bits of scb base (in lsb) */ }; #define ISCPBUSY 0x01 /* cleared by 82586 when reset accepted */ /* * system configuration pointer * 10 (decimal) bytes from 0xFFFFF6 to 0xFFFFFF */ struct scp { u_short scp_sysbus; /* lo order byte is sysbus byte */ u_short scp_sp1; /* unused */ u_short scp_sp2; /* unused by 82586 but used by 68000 */ u_short scp_lo_iscp; /* lo order 16 bits of iscp address */ u_short scp_hi_iscp; /* hi order 8 bits of iscp address (in lsb) */ }; #define SYSBUS_8 0x01 /* indicates 8-bit bus in scp_sysbus */ #define SYSBUS_16 0x00 /* indicates 16-bit bus in scp_sysbus */ /* * macros to extract address pieces... */ #define HI16(addr) ((short)(((int)(addr)) >> 16) & 0xffff) #define LO16(addr) ((short)((int)(addr)) & 0xffff) /* * swap bytes in a 16-bit value at compile time whenever possible */ #define SWAB(jj) (((jj & 0xff) << 8) | ((jj & 0xff00) >> 8)) struct iscp k_iscp; struct scb k_scb; struct cb k_cb; struct fdes k_fdes; #define SCPADDR ((struct scp *) 0xfffff6) #define ISCPADDR (&k_iscp) /* * base address for scb, command and receive frame descriptor blocks */ #ifdef SMARTLINK #define SCBBASE ((int)&k_scb & 0xff0000) #define SCBADDR ((struct scb *)(SCBBASE + LO16(&k_scb))) #define CMDADDR ((struct cb *)(SCBBASE + LO16(&k_cb))) #define FDESADDR ((struct fdes *)(SCBBASE + LO16(&k_fdes))) #else #define SCBBASE scbbase #define SCBADDR scbaddr #define CMDADDR cmdaddr #define FDESADDR fdesaddr #endif /* * convert an i82586 16-bit offset to a 68000 24-bit address */ #define OTOA(type,off) ((type)(SCBBASE + SWAB(off)))