Annotation of researchv9/sys/sundev/iereg.h, revision 1.1

1.1     ! root        1: /*    @(#)if_iereg.h 1.1 86/02/03 SMI      */
        !             2: 
        !             3: /*
        !             4:  * Copyright (c) 1984 by Sun Microsystems, Inc.
        !             5:  */
        !             6: 
        !             7: /*
        !             8:  * Control block definitions for Intel 82586 (Ethernet) chip
        !             9:  * All fields are byte-swapped because the damn chip wants bytes
        !            10:  * in Intel byte order only, so we swap everything going to it.
        !            11:  */
        !            12: 
        !            13: /* byte-swapped data types */
        !            14: typedef u_short ieoff_t;       /* control block offsets from iscp cbbase */
        !            15: #define        IENORBD 0xffff          /* null pointer for rbd */
        !            16: typedef short ieint_t;         /* 16 bit integers */
        !            17: typedef        long ieaddr_t;          /* data (24-bit) addresses */
        !            18: 
        !            19: /*
        !            20:  * System Configuration Pointer
        !            21:  * Must be at 0xFFFFF6 in chip's address space
        !            22:  */
        !            23: #define IESCPADDR 0xFFFFF6
        !            24: struct iescp {
        !            25:        char    ie_sysbus;      /* bus width: 0 => 16, 1 => 8 */
        !            26:        char    ie_junk1[5];    /* unused */
        !            27:        ieaddr_t ie_iscp;       /* address of iscp */
        !            28: };
        !            29: 
        !            30: /*
        !            31:  * Intermediate System Configuration Pointer
        !            32:  * Specifies base of all other control blocks and the offset of the SCB
        !            33:  */
        !            34: struct ieiscp {
        !            35:        char    ie_busy;        /* 1 => initialization in progress */
        !            36:        char    ie_junk2;       /* unused */
        !            37:        ieoff_t ie_scb;         /* offset of SCB */
        !            38:        ieaddr_t ie_cbbase;     /* base of all control blocks */
        !            39: };
        !            40: 
        !            41: /* 
        !            42:  * System Control Block - the focus of communication
        !            43:  */
        !            44: struct iescb {
        !            45:        u_char          : 1;    /* mbz */
        !            46:        u_char  ie_rus  : 3;    /* receive unit status */
        !            47:        u_char          : 4;    /* mbz */
        !            48:        u_char  ie_cx   : 1;    /* command done (interrupt) */
        !            49:        u_char  ie_fr   : 1;    /* frame received (interrupt) */
        !            50:        u_char  ie_cnr  : 1;    /* command unit not ready */
        !            51:        u_char  ie_rnr  : 1;    /* receive unit not ready */
        !            52:        u_char          : 1;    /* mbz */
        !            53:        u_char  ie_cus  : 3;    /* command unit status */
        !            54:        short   ie_cmd;         /* command word */
        !            55:        ieoff_t ie_cbl;         /* command list */
        !            56:        ieoff_t ie_rfa;         /* receive frame area */
        !            57:        ieint_t ie_crcerrs;     /* count of CRC errors */
        !            58:        ieint_t ie_alnerrs;     /* count of alignment errors */
        !            59:        ieint_t ie_rscerrs;     /* count of discarded packets */
        !            60:        ieint_t ie_ovrnerrs;    /* count of overrun packets */
        !            61: #ifdef KERNEL
        !            62:        int     ie_magic;       /* for checking overwrite bug */
        !            63: #define IEMAGIC        0x051956
        !            64: #endif
        !            65: };
        !            66: 
        !            67: /* ie_rus */
        !            68: #define        IERUS_IDLE      0
        !            69: #define        IERUS_SUSPENDED 1
        !            70: #define        IERUS_NORESOURCE 2
        !            71: #define        IERUS_READY     4
        !            72: 
        !            73: /* ie_cus */
        !            74: #define        IECUS_IDLE      0
        !            75: #define        IECUS_SUSPENDED 1
        !            76: #define        IECUS_READY     2
        !            77: 
        !            78: /* ie_cmd */
        !            79: #define        IECMD_RESET     0x8000  /* reset chip */
        !            80: #define        IECMD_RU_START  (1<<12) /* start receiver unit */
        !            81: #define        IECMD_RU_RESUME (2<<12) /* resume receiver unit */
        !            82: #define        IECMD_RU_SUSPEND (3<<12) /* suspend receiver unit */
        !            83: #define        IECMD_RU_ABORT  (4<<12) /* abort receiver unit */
        !            84: #define        IECMD_ACK_CX    0x80    /* ack command executed */
        !            85: #define        IECMD_ACK_FR    0x40    /* ack frame received */
        !            86: #define        IECMD_ACK_CNR   0x20    /* ack CU not ready */
        !            87: #define        IECMD_ACK_RNR   0x10    /* ack RU not ready */
        !            88: #define        IECMD_CU_START  1       /* start receiver unit */
        !            89: #define        IECMD_CU_RESUME 2       /* resume receiver unit */
        !            90: #define        IECMD_CU_SUSPEND 3      /* suspend receiver unit */
        !            91: #define        IECMD_CU_ABORT  4       /* abort receiver unit */
        !            92: 
        !            93: /*
        !            94:  * Generic command block
        !            95:  */
        !            96: struct iecb {
        !            97:        u_char          : 8;    /* part of status */
        !            98:        u_char  ie_done : 1;    /* command done */
        !            99:        u_char  ie_busy : 1;    /* command busy */
        !           100:        u_char  ie_ok   : 1;    /* command successful */
        !           101:        u_char  ie_aborted : 1; /* command aborted */
        !           102:        u_char          : 4;    /* more status */
        !           103:        u_char          : 5;    /* unused */
        !           104:        u_char  ie_cmd  : 3;    /* command # */
        !           105:        u_char  ie_el   : 1;    /* end of list */
        !           106:        u_char  ie_susp : 1;    /* suspend when done */
        !           107:        u_char  ie_intr : 1;    /* interrupt when done */
        !           108:        u_char          : 5;    /* unused */
        !           109:        ieoff_t ie_next;        /* next CB */
        !           110: };
        !           111: 
        !           112: /*
        !           113:  * CB commands (ie_cmd)
        !           114:  */
        !           115: #define        IE_NOP          0
        !           116: #define        IE_IADDR        1       /* individual address setup */
        !           117: #define        IE_CONFIG       2       /* configure */
        !           118: #define        IE_MADDR        3       /* multicast address setup */
        !           119: #define        IE_TRANSMIT     4       /* transmit */
        !           120: #define        IE_TDR          5       /* TDR test */
        !           121: #define        IE_DUMP         6       /* dump registers */
        !           122: #define        IE_DIAGNOSE     7       /* internal diagnostics */
        !           123: 
        !           124: /*
        !           125:  * TDR command block 
        !           126:  */
        !           127: struct ietdr {
        !           128:        struct iecb ietdr_cb;   /* common command block */
        !           129:        u_char  ietdr_timlo: 8; /* time */
        !           130:        u_char  ietdr_ok   : 1; /* link OK */
        !           131:        u_char  ietdr_xcvr : 1; /* transceiver bad */
        !           132:        u_char  ietdr_open : 1; /* cable open */
        !           133:        u_char  ietdr_shrt : 1; /* cable shorted */
        !           134:        u_char             : 1;
        !           135:        u_char  ietdr_timhi: 3; /* time */
        !           136: };
        !           137: 
        !           138: /*
        !           139:  * Individual address setup command block
        !           140:  */
        !           141: struct ieiaddr {
        !           142:        struct iecb ieia_cb;    /* common command block */
        !           143:        char    ieia_addr[6];   /* the actual address */
        !           144: };
        !           145: 
        !           146: /*
        !           147:  * Configure command
        !           148:  */
        !           149: struct ieconf {
        !           150:        struct iecb ieconf_cb;  /* command command block */
        !           151:        u_char             : 4;
        !           152:        u_char  ieconf_bytes : 4;       /* # of conf bytes */
        !           153:        u_char             : 4;
        !           154:        u_char  ieconf_fifolim : 4;     /* fifo limit */
        !           155:        u_char  ieconf_savbf : 1;       /* save bad frames */
        !           156:        u_char  ieconf_srdy  : 1;       /* srdy/ardy (?) */
        !           157:        u_char             : 6;
        !           158:        u_char  ieconf_extlp : 1;       /* external loopback */
        !           159:        u_char  ieconf_intlp : 1;       /* external loopback */
        !           160:        u_char  ieconf_pream : 2;       /* preamble length code */
        !           161:        u_char  ieconf_acloc : 1;       /* addr&type fields separate */
        !           162:        u_char  ieconf_alen  : 3;       /* address length */
        !           163:        u_char  ieconf_bof   : 1;       /* backoff method */
        !           164:        u_char  ieconf_exprio : 3;      /* exponential prio */
        !           165:        u_char             : 1;
        !           166:        u_char  ieconf_linprio : 3;     /* linear prio */
        !           167:        u_char  ieconf_space : 8;       /* interframe spacing */
        !           168:        u_char  ieconf_slttml : 8;      /* low bits of slot time */
        !           169:        u_char  ieconf_retry : 4;       /* # xmit retries */
        !           170:        u_char             : 1;
        !           171:        u_char  ieconf_slttmh : 3;      /* high bits of slot time */
        !           172:        u_char  ieconf_pad    : 1;      /* flag padding */
        !           173:        u_char  ieconf_hdlc   : 1;      /* HDLC framing */
        !           174:        u_char  ieconf_crc16  : 1;      /* CRC type */
        !           175:        u_char  ieconf_nocrc  : 1;      /* disable CRC appending */
        !           176:        u_char  ieconf_nocarr : 1;      /* no carrier OK */
        !           177:        u_char  ieconf_manch  : 1;      /* Manchester encoding */
        !           178:        u_char  ieconf_nobrd  : 1;      /* broadcast disable */
        !           179:        u_char  ieconf_promisc : 1;     /* promiscuous mode */
        !           180:        u_char  ieconf_cdsrc  : 1;      /* CD source */
        !           181:        u_char  ieconf_cdfilt : 3;      /* CD filter bits (?) */
        !           182:        u_char  ieconf_crsrc  : 1;      /* carrier source */
        !           183:        u_char  ieconf_crfilt : 3;      /* carrier filter bits */
        !           184:        u_char  ieconf_minfrm : 8;      /* min frame length */
        !           185:        u_char             : 8;
        !           186: };
        !           187: 
        !           188: /*
        !           189:  * Receive frame descriptor
        !           190:  */
        !           191: struct ierfd {
        !           192:        u_char  ierfd_short     : 1;    /* short frame */
        !           193:        u_char  ierfd_noeof     : 1;    /* no EOF (bitstuffing mode only) */
        !           194:        u_char                  : 6;    /* unused */
        !           195:        u_char  ierfd_done      : 1;    /* command done */
        !           196:        u_char  ierfd_busy      : 1;    /* command busy */
        !           197:        u_char  ierfd_ok        : 1;    /* command successful */
        !           198:        u_char                  : 1;    /* unused */
        !           199:        u_char  ierfd_crcerr    : 1;    /* crc error */
        !           200:        u_char  ierfd_align     : 1;    /* alignment error */
        !           201:        u_char  ierfd_nospace   : 1;    /* out of buffer space */
        !           202:        u_char  ierfd_overrun   : 1;    /* DMA overrun */
        !           203:        u_char                  : 8;    /* unused */
        !           204:        u_char  ierfd_el        : 1;    /* end of list */
        !           205:        u_char  ierfd_susp      : 1;    /* suspend when done */
        !           206:        u_char                  : 6;    /* unused */
        !           207:        ieoff_t ierfd_next;             /* next RFD */
        !           208:        ieoff_t ierfd_rbd;              /* pointer to buffer descriptor */
        !           209:        u_char  ierfd_dhost[6];         /* destination address field */
        !           210:        u_char  ierfd_shost[6];         /* source address field */
        !           211:        u_short ierfd_type;             /* Ethernet packet type field */
        !           212: };
        !           213: 
        !           214: /*
        !           215:  * Receive buffer descriptor
        !           216:  */
        !           217: struct ierbd {
        !           218:        u_char  ierbd_cntlo     : 8;    /* Low order 8 bits of count */
        !           219:        u_char  ierbd_eof       : 1;    /* last buffer for this packet */
        !           220:        u_char  ierbd_used      : 1;    /* EDLC sets when buffer is used */
        !           221:        u_char  ierbd_cnthi     : 6;    /* High order 6 bits of count */
        !           222:        ieoff_t ierbd_next;             /* next RBD */
        !           223:        ieaddr_t ierbd_buf;             /* pointer to buffer */
        !           224:        u_char  ierbd_sizelo    : 8;    /* Low order 8 bits of buffer size */
        !           225:        u_char  ierbd_el        : 1;    /* end-of-list if set */
        !           226:        u_char                  : 1;    /* unused */
        !           227:        u_char  ierbd_sizehi    : 6;    /* High order 6 bits of buffer size */
        !           228: #ifdef KERNEL
        !           229:        struct ieipack *ierbd_iep;      /* ptr to data packet descriptor */
        !           230: #endif
        !           231: };
        !           232: 
        !           233: /*
        !           234:  * Transmit frame descriptor ( Transmit command block )
        !           235:  */
        !           236: struct ietfd {
        !           237:        u_char  ietfd_defer     : 1;    /* transmission deferred */
        !           238:        u_char  ietfd_heart     : 1;    /* Heartbeat */
        !           239:        u_char  ietfd_xcoll     : 1;    /* Too many collisions */
        !           240:        u_char                  : 1;    /* unused */
        !           241:        u_char  ietfd_ncoll     : 4;    /* Number of collisions */
        !           242:        u_char  ietfd_done      : 1;    /* command done */
        !           243:        u_char  ietfd_busy      : 1;    /* command busy */
        !           244:        u_char  ietfd_ok        : 1;    /* command successful */
        !           245:        u_char  ietfd_aborted   : 1;    /* command aborted */
        !           246:        u_char                  : 1;    /* unused */
        !           247:        u_char  ietfd_nocarr    : 1;    /* No carrier sense */
        !           248:        u_char  ietfd_nocts     : 1;    /* Lost Clear to Send */
        !           249:        u_char  ietfd_underrun  : 1;    /* DMA underrun */
        !           250:        u_char                  : 5;    /* unused */
        !           251:        u_char  ietfd_cmd       : 3;    /* command # */
        !           252:        u_char  ietfd_el        : 1;    /* end of list */
        !           253:        u_char  ietfd_susp      : 1;    /* suspend when done */
        !           254:        u_char  ietfd_intr      : 1;    /* interrupt when done */
        !           255:        u_char                  : 5;    /* unused */
        !           256:        ieoff_t ietfd_next;             /* next RFD */
        !           257:        ieoff_t ietfd_tbd;              /* pointer to buffer descriptor */
        !           258:        u_char  ietfd_dhost[6];         /* destination address field */
        !           259:        u_short ietfd_type;             /* Ethernet packet type field */
        !           260: #ifdef KERNEL
        !           261:        struct mbuf *ietfd_mbuf;        /* associated mbuf chain */
        !           262: #endif
        !           263: };
        !           264: 
        !           265: /*
        !           266:  * Transmit buffer descriptor
        !           267:  */
        !           268: struct ietbd {
        !           269:        u_char   ietbd_cntlo    : 8;    /* Low order 8 bits of count */
        !           270:        u_char   ietbd_eof      : 1;    /* last buffer for this packet */
        !           271:        u_char                  : 1;    /* unused */
        !           272:        u_char   ietbd_cnthi    : 6;    /* High order 6 bits of count */
        !           273:        ieoff_t  ietbd_next;            /* next TBD */
        !           274:        ieaddr_t ietbd_buf;             /* pointer to buffer */
        !           275: #ifdef KERNEL
        !           276:        short   ietbd_memlen;           /* memory size for data copy */
        !           277: #endif
        !           278: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.