Annotation of cci/sys/tahoeif/if_acereg.h, revision 1.1

1.1     ! root        1: /*                                                             */
        !             2: /*     ACC ethernet controller definitions, VERSAbus version   */
        !             3: /*     product name V/EIU, unix name ACE                       */
        !             4: /*                                                             */
        !             5: 
        !             6: /*                                                             */
        !             7: /*     register definitions                                    */
        !             8: /*                                                             */
        !             9: struct acedevice{
        !            10:        struct rx_addr_ram  {         /* receive address match ram.     */
        !            11:          short station_addr[6];     /* Ethernet Station Addr  */
        !            12:          short broadcast_en[2];     /* Broadcast Reception OK */
        !            13:          short mcast_hash_code[8];  /* Multicast Hash Code    */
        !            14:        }       rar;      
        !            15:        short   csr;            /* hardwired control and status register */
        !            16:        short   tseg;           /* active transmit segment #             */
        !            17:        short   rseg;           /* active receive  segment #             */
        !            18:        short   segb;           /* segment boundary register             */
        !            19:        short   lrf;            /* lost receive frame counter            */
        !            20:        short   ivct;           /* interrupt vector register.            */
        !            21:        short   nada0;          /*  -- reserved for future use --        */
        !            22:        short   fcoll;          /* force collision register.             */
        !            23: };
        !            24: 
        !            25: /*
        !            26: The following two structure define the format of "transmit and receive
        !            27: segments" in the V/EIU's Dual-Ported Memory.  Each segment is 2KBytes
        !            28: long and buffers either an outgoing (transmit segment) or incoming 
        !            29: (receive segment) Ethernet Frame.
        !            30: */
        !            31: 
        !            32: struct tx_segment {
        !            33:           short        tx_csr;         /* control and status register */
        !            34:           char         tx_data[2014];  /* frame buffer area           */
        !            35:           short        tx_backoff[16]; /* control and status register */
        !            36:           };
        !            37: 
        !            38: struct rx_segment {
        !            39:           short        rx_csr;         /* control and status register */
        !            40:           char         rx_data[2046];  /* frame buffer area           */
        !            41:           };
        !            42: 
        !            43: /*
        !            44: The following two structures define the descriptors used to represent a logical
        !            45: queue of Ethernet frames.  The structure supports a FIFO queue mechanism.
        !            46: For each queue there is a general control structure that tracks the location
        !            47: of the first and last elements of the queue.  Each element contains infromation
        !            48: relating to the location of the Ethernet frame & the # of bytes it contains,
        !            49: and the location of the next element in the queue.
        !            50: */
        !            51: 
        !            52: struct ace_element {
        !            53:        struct  ace_element *pNext;  /* ptr to the next element of the queue  */
        !            54:        char    *pFrame;        /* ptr to Ethernet frame assoc w/ elem.  */
        !            55:      };
        !            56: 
        !            57: 
        !            58: struct ace_queue {
        !            59:      struct ace_element* phead;       /* ptr to first element of queue */
        !            60:      struct ace_element* ptail;       /* ptr to last element of queue  */
        !            61:      };
        !            62: 
        !            63: 
        !            64: /*
        !            65: The following structure defines the statistics control block which maintains
        !            66: the Ethernet data transfer statistics for a single V/EIU unit.
        !            67: */ 
        !            68: 
        !            69: struct ace_stats {
        !            70:             int            rx_datagrams;    /* # valid datagrams received    */
        !            71:             int            rx_crc_errors;   /* # rcv'd w/ CRC errors         */
        !            72:             int            rx_overruns;     /* # rcv'd too large( > 1514)    */
        !            73:             int            rx_underruns;    /* # rcv'd too small( < 64)      */
        !            74:             int            rx_align_errors; /* # rcv'd w/ odd # bytes        */
        !            75:             int            rx_reserved;     /* <reserved for future use>     */
        !            76:            int            rx_busy;         /* # of busy recv segment        */
        !            77:             int                   rx_mbuf;         /* # of recvd mbufs              */
        !            78:             int                   rx_oddoff;       /* # of odd offset in recv mbuf  */
        !            79:            int            rx_rintcnt;      /* # of incoming packets */
        !            80:            int            rx_rwoint;       /* # of recv WITHOUT interrpt    */
        !            81: 
        !            82:             int            tx_datagrams;    /* # datagrams tx'd successful   */
        !            83:             int            tx_retries;      /* # tx retries due to collision */
        !            84:             int            tx_discarded;    /* # tx dropped from >15 retries */
        !            85:             int                   tx_busy;         /* # of busy xmit segment        */
        !            86:             int                   tx_cbusy;        /* # acecint() finds busy segment*/
        !            87:             int                   tx_mbuf;         /* # of transmitted mbufs        */
        !            88:            int            tx_oddoff;       /* # of odd offset in xmit mbuf  */
        !            89:            int            tx_outcnt;       /* # of outputting requests      */
        !            90:            int            tx_startcnt;     /* # of calls to acestart()      */
        !            91:            int            tx_cintcnt;      /* # of completed transmissions  */
        !            92:            int            tx_xwoint;       /* # of xmit WITHOUT interrpt    */
        !            93:        };
        !            94: 
        !            95: /*
        !            96: The following structure defines the format of Ethernet Station Address and
        !            97: the format of the Hash Code used by the V/EIU do filter receipt of multicast
        !            98: datagram incoming from the Ethernet.
        !            99: */ 
        !           100: 
        !           101: struct station_addr {
        !           102:             char           esa[6];          /* 6 byte field in address */
        !           103:        };
        !           104: 
        !           105: struct hash_code    {
        !           106:             char           mhc[8];          /* 8 byte field in hash code */
        !           107:        };
        !           108: 
        !           109: /*
        !           110: The following structure defines the descriptor used to represent a logical
        !           111: V/EIU unit.  Often referred to as "Unit Control Block (UCB)", this structure
        !           112: maintains information as to the location, state, and status of the controller.
        !           113: */
        !           114: 
        !           115: #ifdef INLINE
        !           116: struct ace_unit {
        !           117:      struct ace_regs   *pReg;           /* ptr to unit's I/O registers    */
        !           118:             char*         pDpm;           /* ptr to unit's Dual-Port Memory */
        !           119:             short         segboundry;     /* first Tx Seg in unit's DPM     */
        !           120:             short         eictr;          /* Rx segment tracking counter    */
        !           121:             short         eoctr;          /* Tx segment tracking counter    */
        !           122:             short         tx_next;        /* next available Tx segment ctr  */
        !           123:             EVENTCOUNT    rx_arrived;     /* received frames eventcounter   */
        !           124:             EVENTCOUNT    rx_processed;   /* rx'd & processed frames EC     */
        !           125:             EVENTCOUNT    tx_complete;    /* tx'd frames eventcounter       */
        !           126:             SEMAPHORE     rx_semaphore;   /* receive frame semaphore        */
        !           127:             SEMAPHORE     tx_semaphore;   /* transmit frame semaphore       */
        !           128:             short         cur_rnd;        /* current random # value         */
        !           129:             short         diag_code;      /* diagnostic error & test codes  */
        !           130:             short         state;          /* status of unit                 */
        !           131:      struct ace_queue   rx_queue;       /* received frame queue           */
        !           132:      struct ace_queue   av_queue;       /* available queue (free list)    */
        !           133:      struct ace_element av_elements[9]; /* unit queue elements            */
        !           134:      struct ace_stats   statistics;     /* unit's statistics              */
        !           135:             short         rx_reset;       /* receive code's reset ctl word  */
        !           136:             short         tx_reset;       /* transmit code's reset ctl word */
        !           137:             short         rx_waiting;     /* receiver sleeping status flag  */
        !           138:             short         tx_waiting;     /* transmitter sleeping status flg*/
        !           139:      };
        !           140: #endif INLINE
        !           141: 
        !           142:  /*
        !           143: V/EIU CONTROL/STATUS REGISTER BIT DEFINITIONS
        !           144: =============================================
        !           145: 
        !           146: The following defines the bits in the V/EIU's "Control/Status Register".
        !           147: Each bit definition is followed by a brief description which includes 
        !           148: a reference to its read/write capabilities as well as it's active state
        !           149: if appropriate.  "r/w" := read/write, "r" := read only, and "w" := write 
        !           150: only.  "aL" := active LOW and "aH" := active high".  The first three letters 
        !           151: of the bits' names, "CSR", indicate definition for the "CSR register" only.
        !           152: */
        !           153: 
        !           154: #define  CSR_UNUSED      0xFD00 /* unused bits                       "??_??" */
        !           155: #define  CSR_ENXMITODD   0x0200 /* Enable Odd # byte transmission    "rw_aH" */
        !           156: #define  CSR_ACTIVE      0x0080 /* V/EIU is active & running         "r _aH" */
        !           157: #define  CSR_RESET       0x0040 /* V/EIU reset control line          " w_aH" */
        !           158: #define  CSR_PROMISCUOUS 0x0020 /* Enable "promiscous mode" operation"rw_aH" */
        !           159: #define  CSR_NOXMITCRC   0x0010 /* Disable CRC generation & checking "rw_aH" */
        !           160: #define  CSR_LOOP3       0x0008 /* Enable MODE 3 LOOPBACK mode       "rw_aH" */
        !           161: #define  CSR_LOOP2       0x0004 /* Enable MODE 2 LOOPBACK mode       "rw_aH" */
        !           162: #define  CSR_ENINT       0x0002 /* Enable Interrupts to VERSAbus     "rw_aH" */
        !           163: #define  CSR_GO          0x0001 /* Enable V/EIU operations           " w_aH" */
        !           164: 
        !           165: /*
        !           166: V/EIU VALID BIT MASKS
        !           167: =====================
        !           168: 
        !           169: The following defines the valid bits of "short" fields contained in
        !           170: the V/EIU's "Receive Address Match Ram".  The first three letters
        !           171: of the masks' names indicate definition for the following:
        !           172:    RAR ==> Receive Address Ram          IVC ==> Interrupt Vector Register
        !           173:    LRF ==> Lost Receive Frame Counter   FCL ==> Force Collision Register
        !           174: */
        !           175: 
        !           176: #define  RAR_VALID       0x00FF /* Valid bits in Receive Address Ram fields  */
        !           177: #define  LRF_VALID       0x000F /* Valid bits in Lost Receive Frame register */
        !           178: #define  IVC_VALID       0x00F8 /* Valid bits in Interrupt Vector register   */
        !           179: #define  FCL_VALID       0xFFFF /* Valid bits in Force Collision register    */
        !           180: 
        !           181: /*
        !           182: V/EIU TRANSMIT SEGMENT CONTROL/STATUS BIT DEFINITIONS
        !           183: =====================================================
        !           184: 
        !           185: The following defines the bit-fields in the "Control/Status Field" of a 
        !           186: Transmit Segment in the V/EIU's Dual-Ported Memory.  There are two 
        !           187: types of bit-fields it this field, those that produce a response by the 
        !           188: V/EIU ("command") and those that indicate the response ("status")
        !           189: The first three letters of the bits' names, "TCS", indicate definition 
        !           190: for the "Tx segment CSr" only.
        !           191: */
        !           192: 
        !           193: /* commands */
        !           194: #define  TCS_TBFULL     (short)0x8000 /*   Tx Bfr Full so send it           */
        !           195: #define  TCS_TBC         (short)0x07FF /*   Tx Byte Count                    */
        !           196: /* status */
        !           197: #define  TCS_TBMT        (short)0x8000 /*   Tx Buffer Empty   (avail for Tx) */
        !           198: #define  TCS_RTFAIL      (short)0x4000 /*   Tx Retries Failed (frame dropped)*/
        !           199: #define  TCS_RTC         (short)0x000F /*   Tx # Retries which collided      */
        !           200: 
        !           201: /*
        !           202: V/EIU RECEIVE SEGMENT CONTROL/STATUS BIT DEFINITIONS
        !           203: ====================================================
        !           204: 
        !           205: The following defines the bit-fields in the "Control/Status Field" of a 
        !           206: Receive Segment in the V/EIU's Dual-Ported Memory.  There are two 
        !           207: types of bit-fields it this field, those that produce a response by the 
        !           208: V/EIU ("command") and those that indicate the response ("status")
        !           209: The first three letters of the bits' names, "RCS", indicate definition 
        !           210: for the "Rx segment CSr" only.
        !           211: */
        !           212: 
        !           213: #define  RCS_RBMT        0x8000 /* command:  Rx Bfr Empty      (avail for Rx) */
        !           214: #define  RCS_RBFULL      0x8000 /* status :  Rx Bfr Full       (frame Rx'd)   */
        !           215: #define  RCS_ROVRN       0x4000 /*        :  Rx Bfr Overrun Error (too long)  */
        !           216: #define  RCS_RCRC        0x2000 /*        :  Rx Bfr CRC Error  (bad data)     */
        !           217: #define  RCS_RODD        0x1000 /*        :  Rx Bfr Alignment Error (odd cnt) */
        !           218: #define  RCS_RBC         0x07FF /*        :  Rx Bfr Byte Count                */
        !           219: 
        !           220: /*
        !           221: V/EIU SPECIAL FUNCTION CODE DEFINITIONS
        !           222: =======================================
        !           223: 
        !           224: The following define the valid functions codes available for use with
        !           225: the "spfun ()" entry point into this driver.
        !           226: */
        !           227: 
        !           228: #define  ACE_INIT      0x0001     /* V/EIU Initialize command        */
        !           229: #define  ACE_RESP      0x0002     /* V/EIU Initialize response       */
        !           230: #define  ACE_STATS     0x0003     /* V/EIU Statistics query          */
        !           231: #define  ACE_ECMAP     0x0004     /* V/EIU Event counter map request */
        !           232: #define  ACE_IOPORTS   0x0005     /* V/EIU I/O Ports Dump            */
        !           233: #define  ACE_UCBSTATS  0x0006     /* V/EIU UCB contents Dump         */
        !           234: 
        !           235: /*
        !           236: V/EIU RETURNED ERROR CODES
        !           237: ==========================
        !           238: 
        !           239: The following define the range of error codes which may be returned by
        !           240: this driver to calling user processes.  The first letter of the error code's 
        !           241: names, "E", indicates definition for "returned error codes" only.
        !           242: */
        !           243: 
        !           244: #define  E_BADDEV        (-100)    /* illegal minor device                   */
        !           245: #define  E_OFFLINE       (-101)    /* requested unit is not on-line          */
        !           246: #define  E_LOSTSYNC      (-102)    /* driver syncronization lost w/ hardware */
        !           247: #define  E_SIGNALED      (-103)    /* I/O request terminated due to signal() */
        !           248: #define  E_2BIG          (-104)    /* transmit request for oversize frame    */
        !           249: #define  E_2SMALL        (-105)    /* receive request for undersize frame    */
        !           250: #define  E_BADCALL       (-106)    /* illegal "spfun()" call                 */
        !           251: #define  E_RESET         (-107)    /* unit reset while waiting for i/o to end*/
        !           252: 
        !           253: /*
        !           254: V/EIU MISCELLANEOUS DEFINTIIONS
        !           255: ===============================
        !           256: 
        !           257: The following are miscellaneous constant definitions and come from
        !           258: a number of places for a number of different reasons.
        !           259: */
        !           260: 
        !           261: #define  ACE_OFFLINE   0         /* off-line unit status                   */
        !           262: #define  ACE_ONLINE    0         /* on-line unit status                    */
        !           263: #define  CRC_SIZE        4         /* number of bytes in a rx seg's CRC      */
        !           264: #define  RCW_SIZE        2         /* number of bytes in a rx seg's csr      */
        !           265: #define  M_READ          "read"    /* read diagnostic string                 */
        !           266: #define  M_WRITE         "write"   /* write diagnostic string                */
        !           267: #define  SEG_MAX         15        /* largest valid V/EIU segment number     */
        !           268: #define  MXRXPKTSZ       1516      /* max. size of allowed rx/tx frames +RCW */
        !           269: #define  ET_MINLEN       64        /* min. size of allowed rx/tx frames      */
        !           270: #define  ET_MAXLEN       1514      /* max. size of rx/tx frames w/o CRC & RCW*/
        !           271: #define  EC_ARRIVED      42        /* EC mapping number for "rx_arrived EC   */
        !           272: #define  EC_PROCESSED    43        /* EC mapping number for "rx_processed EC */
        !           273: #define  RX_ARVD_EC      42        /* Select code for rx_arrived EC mapping  */
        !           274: #define  RX_PRCD_EC      43        /* Select code for rx_processed EC mapping*/
        !           275: 
        !           276: 
        !           277: /*
        !           278:  * Ethernet software status per interface.
        !           279:  *
        !           280:  * Each interface is referenced by a network interface structure,
        !           281:  * is_if, which the routing code uses to locate the interface.
        !           282:  * This structure contains the output queue for the interface, its address, ...
        !           283:  */
        !           284: struct ace_softc {
        !           285:        struct  arpcom is_ac;           /* Ethernet common part         */
        !           286: #define        is_if   is_ac.ac_if             /* network-visible interface    */
        !           287: #define        is_addr is_ac.ac_enaddr         /* hardware Ethernet address    */
        !           288:        char    *is_dpm;
        !           289:        short   is_flags;
        !           290: #define        ACEF_OACTIVE    0x1             /* output is active             */
        !           291: #define        ACEF_RCVPENDING 0x2             /* start rcv in acecint         */
        !           292:        short   is_promiscuous;         /* true is enabled              */
        !           293:        short   is_segboundry;          /* first TX Seg in dpm          */
        !           294:        short   is_eictr;               /* Rx segment tracking ctr      */
        !           295:        short   is_eoctr;               /* Tx segment tracking ctr      */
        !           296:        short   is_txnext;              /* Next available Tx segment    */
        !           297:        short   is_currnd;              /* current random backoff       */
        !           298:        struct  ace_stats is_stats;     /* holds board statistics       */
        !           299:        short   is_xcnt;                /* count xmitted segments to be acked 
        !           300:                                           by the controller */
        !           301: };

unix.superglobalmegacorp.com

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