Annotation of Gnu-Mach/linux/src/drivers/net/i82586.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Intel 82586 IEEE 802.3 Ethernet LAN Coprocessor.
                      3:  *
                      4:  * See:
                      5:  *     Intel Microcommunications 1991
                      6:  *     p1-1 to p1-37
                      7:  *     Intel order No. 231658
                      8:  *     ISBN 1-55512-119-5
                      9:  *
                     10:  *     Unfortunately, the above chapter mentions neither
                     11:  * the System Configuration Pointer (SCP) nor the
                     12:  * Intermediate System Configuration Pointer (ISCP),
                     13:  * so we probably need to look elsewhere for the
                     14:  * whole story -- some recommend the "Intel LAN
                     15:  * Components manual" but I have neither a copy
                     16:  * nor a full reference.  But "elsewhere" may be
                     17:  * in the same publication...
                     18:  *     The description of a later device, the
                     19:  * "82596CA High-Performance 32-Bit Local Area Network
                     20:  * Coprocessor", (ibid. p1-38 to p1-109) does mention
                     21:  * the SCP and ISCP and also has an i82586 compatibility
                     22:  * mode.  Even more useful is "AP-235 An 82586 Data Link
                     23:  * Driver" (ibid. p1-337 to p1-417).
                     24:  */
                     25: 
                     26: #define        I82586_MEMZ     (64 * 1024)
                     27: 
                     28: #define        I82586_SCP_ADDR (I82586_MEMZ - sizeof(scp_t))
                     29: 
                     30: #define        ADDR_LEN        6
                     31: #define        I82586NULL      0xFFFF
                     32: 
                     33: #define        toff(t,p,f)     (unsigned short)((void *)(&((t *)((void *)0 + (p)))->f) - (void *)0)
                     34: 
                     35: /*
                     36:  * System Configuration Pointer (SCP).
                     37:  */
                     38: typedef struct scp_t   scp_t;
                     39: struct scp_t
                     40: {
                     41:        unsigned short  scp_sysbus;     /* 82586 bus width:     */
                     42: #define                SCP_SY_16BBUS   (0x0 << 0)      /* 16 bits */
                     43: #define                SCP_SY_8BBUS    (0x1 << 0)      /*  8 bits. */
                     44:        unsigned short  scp_junk[2];    /* Unused */
                     45:        unsigned short  scp_iscpl;      /* lower 16 bits of ISCP_ADDR */
                     46:        unsigned short  scp_iscph;      /* upper 16 bits of ISCP_ADDR */
                     47: };
                     48: 
                     49: /*
                     50:  * Intermediate System Configuration Pointer (ISCP).
                     51:  */
                     52: typedef struct iscp_t  iscp_t;
                     53: struct iscp_t
                     54: {
                     55:        unsigned short  iscp_busy;      /* set by CPU before first CA,  */
                     56:                                        /* cleared by 82586 after read. */
                     57:        unsigned short  iscp_offset;    /* offset of SCB                */
                     58:        unsigned short  iscp_basel;     /* base of SCB                  */
                     59:        unsigned short  iscp_baseh;     /*  "                           */
                     60: };
                     61: 
                     62: /*
                     63:  * System Control Block (SCB).
                     64:  *     The 82586 writes its status to scb_status and then
                     65:  *     raises an interrupt to alert the CPU.
                     66:  *     The CPU writes a command to scb_command and
                     67:  *     then issues a Channel Attention (CA) to alert the 82586.
                     68:  */
                     69: typedef struct scb_t   scb_t;
                     70: struct scb_t
                     71: {
                     72:        unsigned short  scb_status;     /* Status of 82586              */
                     73: #define                SCB_ST_INT      (0xF << 12)     /* Some of:             */
                     74: #define                SCB_ST_CX       (0x1 << 15)     /* Cmd completed        */
                     75: #define                SCB_ST_FR       (0x1 << 14)     /* Frame received       */
                     76: #define                SCB_ST_CNA      (0x1 << 13)     /* Cmd unit not active  */
                     77: #define                SCB_ST_RNR      (0x1 << 12)     /* Rcv unit not ready   */
                     78: #define                SCB_ST_JUNK0    (0x1 << 11)     /* 0                    */
                     79: #define                SCB_ST_CUS      (0x7 <<  8)     /* Cmd unit status      */
                     80: #define                        SCB_ST_CUS_IDLE (0 << 8)        /* Idle         */
                     81: #define                        SCB_ST_CUS_SUSP (1 << 8)        /* Suspended    */
                     82: #define                        SCB_ST_CUS_ACTV (2 << 8)        /* Active       */
                     83: #define                SCB_ST_JUNK1    (0x1 <<  7)     /* 0                    */
                     84: #define                SCB_ST_RUS      (0x7 <<  4)     /* Rcv unit status      */
                     85: #define                        SCB_ST_RUS_IDLE (0 << 4)        /* Idle         */
                     86: #define                        SCB_ST_RUS_SUSP (1 << 4)        /* Suspended    */
                     87: #define                        SCB_ST_RUS_NRES (2 << 4)        /* No resources */
                     88: #define                        SCB_ST_RUS_RDY  (4 << 4)        /* Ready        */
                     89:        unsigned short  scb_command;    /* Next command                 */
                     90: #define                SCB_CMD_ACK_CX  (0x1 << 15)     /* Ack cmd completion   */
                     91: #define                SCB_CMD_ACK_FR  (0x1 << 14)     /* Ack frame received   */
                     92: #define                SCB_CMD_ACK_CNA (0x1 << 13)     /* Ack CU not active    */
                     93: #define                SCB_CMD_ACK_RNR (0x1 << 12)     /* Ack RU not ready     */
                     94: #define                SCB_CMD_JUNKX   (0x1 << 11)     /* Unused               */
                     95: #define                SCB_CMD_CUC     (0x7 <<  8)     /* Command Unit command */
                     96: #define                        SCB_CMD_CUC_NOP (0 << 8)        /* Nop          */
                     97: #define                        SCB_CMD_CUC_GO  (1 << 8)        /* Start cbl_offset */
                     98: #define                        SCB_CMD_CUC_RES (2 << 8)        /* Resume execution */
                     99: #define                        SCB_CMD_CUC_SUS (3 << 8)        /* Suspend   "  */
                    100: #define                        SCB_CMD_CUC_ABT (4 << 8)        /* Abort     "  */
                    101: #define                SCB_CMD_RESET   (0x1 <<  7)     /* Reset chip (hardware) */
                    102: #define                SCB_CMD_RUC     (0x7 <<  4)     /* Receive Unit command */
                    103: #define                        SCB_CMD_RUC_NOP (0 << 4)        /* Nop          */
                    104: #define                        SCB_CMD_RUC_GO  (1 << 4)        /* Start rfa_offset */
                    105: #define                        SCB_CMD_RUC_RES (2 << 4)        /* Resume reception */
                    106: #define                        SCB_CMD_RUC_SUS (3 << 4)        /* Suspend   "  */
                    107: #define                        SCB_CMD_RUC_ABT (4 << 4)        /* Abort     "  */
                    108:        unsigned short  scb_cbl_offset; /* Offset of first command unit */
                    109:                                        /* Action Command               */
                    110:        unsigned short  scb_rfa_offset; /* Offset of first Receive      */
                    111:                                        /* Frame Descriptor in the      */
                    112:                                        /* Receive Frame Area           */
                    113:        unsigned short  scb_crcerrs;    /* Properly aligned frames      */
                    114:                                        /* received with a CRC error    */
                    115:        unsigned short  scb_alnerrs;    /* Misaligned frames received   */
                    116:                                        /* with a CRC error             */
                    117:        unsigned short  scb_rscerrs;    /* Frames lost due to no space  */
                    118:        unsigned short  scb_ovrnerrs;   /* Frames lost due to slow bus  */
                    119: };
                    120: 
                    121: #define        scboff(p,f)     toff(scb_t, p, f)
                    122: 
                    123: /*
                    124:  * The eight Action Commands.
                    125:  */
                    126: typedef enum acmd_e    acmd_e;
                    127: enum acmd_e
                    128: {
                    129:        acmd_nop        = 0,    /* Do nothing                           */
                    130:        acmd_ia_setup   = 1,    /* Load an (ethernet) address into the  */
                    131:                                /* 82586                                */
                    132:        acmd_configure  = 2,    /* Update the 82586 operating parameters */
                    133:        acmd_mc_setup   = 3,    /* Load a list of (ethernet) multicast  */
                    134:                                /* addresses into the 82586             */
                    135:        acmd_transmit   = 4,    /* Transmit a frame                     */
                    136:        acmd_tdr        = 5,    /* Perform a Time Domain Reflectometer  */
                    137:                                /* test on the serial link              */
                    138:        acmd_dump       = 6,    /* Copy 82586 registers to memory       */
                    139:        acmd_diagnose   = 7,    /* Run an internal self test            */
                    140: };
                    141: 
                    142: /*
                    143:  * Generic Action Command header.
                    144:  */
                    145: typedef struct ach_t   ach_t;
                    146: struct ach_t
                    147: {
                    148:        unsigned short  ac_status;              /* Command status:      */
                    149: #define                AC_SFLD_C       (0x1 << 15)     /* Command completed    */
                    150: #define                AC_SFLD_B       (0x1 << 14)     /* Busy executing       */
                    151: #define                AC_SFLD_OK      (0x1 << 13)     /* Completed error free */
                    152: #define                AC_SFLD_A       (0x1 << 12)     /* Command aborted      */
                    153: #define                AC_SFLD_FAIL    (0x1 << 11)     /* Selftest failed      */
                    154: #define                AC_SFLD_S10     (0x1 << 10)     /* No carrier sense     */
                    155:                                                /* during transmission  */
                    156: #define                AC_SFLD_S9      (0x1 <<  9)     /* Tx unsuccessful:     */
                    157:                                                /* (stopped) lost CTS   */
                    158: #define                AC_SFLD_S8      (0x1 <<  8)     /* Tx unsuccessful:     */
                    159:                                                /* (stopped) slow DMA   */
                    160: #define                AC_SFLD_S7      (0x1 <<  7)     /* Tx deferred:         */
                    161:                                                /* other link traffic   */
                    162: #define                AC_SFLD_S6      (0x1 <<  6)     /* Heart Beat: collision */
                    163:                                                /* detect after last tx */
                    164: #define                AC_SFLD_S5      (0x1 <<  5)     /* Tx stopped:          */
                    165:                                                /* excessive collisions */
                    166: #define                AC_SFLD_MAXCOL  (0xF <<  0)     /* Collision count      */
                    167:        unsigned short  ac_command;             /* Command specifier:   */
                    168: #define                AC_CFLD_EL      (0x1 << 15)     /* End of command list  */
                    169: #define                AC_CFLD_S       (0x1 << 14)     /* Suspend on completion */
                    170: #define                AC_CFLD_I       (0x1 << 13)     /* Interrupt on completion */
                    171: #define                AC_CFLD_CMD     (0x7 <<  0)     /* acmd_e               */
                    172:        unsigned short  ac_link;                /* Next Action Command  */
                    173: };
                    174: 
                    175: #define        acoff(p,f)      toff(ach_t, p, f)
                    176: 
                    177: /*
                    178:  * The Nop Action Command.
                    179:  */
                    180: typedef struct ac_nop_t        ac_nop_t;
                    181: struct ac_nop_t
                    182: {
                    183:        ach_t   nop_h;
                    184: };
                    185: 
                    186: /*
                    187:  * The IA-Setup Action Command.
                    188:  */
                    189: typedef struct ac_ias_t        ac_ias_t;
                    190: struct ac_ias_t
                    191: {
                    192:        ach_t           ias_h;
                    193:        unsigned char   ias_addr[ADDR_LEN]; /* The (ethernet) address   */
                    194: };
                    195: 
                    196: /*
                    197:  * The Configure Action Command.
                    198:  */
                    199: typedef struct ac_cfg_t        ac_cfg_t;
                    200: struct ac_cfg_t
                    201: {
                    202:        ach_t           cfg_h;
                    203:        unsigned char   cfg_byte_cnt;   /* Size foll data: 4-12 */
                    204: #define        AC_CFG_BYTE_CNT(v)      (((v) & 0xF) << 0)
                    205:        unsigned char   cfg_fifolim;    /* FIFO threshold       */
                    206: #define        AC_CFG_FIFOLIM(v)       (((v) & 0xF) << 0)
                    207:        unsigned char   cfg_byte8;
                    208: #define        AC_CFG_SAV_BF(v)        (((v) & 0x1) << 7)      /* Save rxd bad frames  */
                    209: #define        AC_CFG_SRDY(v)          (((v) & 0x1) << 6)      /* SRDY/ARDY pin means  */
                    210:                                                        /* external sync.       */
                    211:        unsigned char   cfg_byte9;
                    212: #define        AC_CFG_ELPBCK(v)        (((v) & 0x1) << 7)      /* External loopback    */
                    213: #define        AC_CFG_ILPBCK(v)        (((v) & 0x1) << 6)      /* Internal loopback    */
                    214: #define        AC_CFG_PRELEN(v)        (((v) & 0x3) << 4)      /* Preamble length      */
                    215: #define                AC_CFG_PLEN_2           0               /*  2 bytes     */
                    216: #define                AC_CFG_PLEN_4           1               /*  4 bytes     */
                    217: #define                AC_CFG_PLEN_8           2               /*  8 bytes     */
                    218: #define                AC_CFG_PLEN_16          3               /* 16 bytes     */
                    219: #define        AC_CFG_ALOC(v)          (((v) & 0x1) << 3)      /* Addr/len data is     */
                    220:                                                        /* explicit in buffers  */
                    221: #define        AC_CFG_ADDRLEN(v)       (((v) & 0x7) << 0)      /* Bytes per address    */
                    222:        unsigned char   cfg_byte10;
                    223: #define        AC_CFG_BOFMET(v)        (((v) & 0x1) << 7)      /* Use alternate expo.  */
                    224:                                                        /* backoff method       */
                    225: #define        AC_CFG_ACR(v)           (((v) & 0x7) << 4)      /* Accelerated cont. res. */
                    226: #define        AC_CFG_LINPRIO(v)       (((v) & 0x7) << 0)      /* Linear priority      */
                    227:        unsigned char   cfg_ifs;        /* Interframe spacing           */
                    228:        unsigned char   cfg_slotl;      /* Slot time (low byte)         */
                    229:        unsigned char   cfg_byte13;
                    230: #define        AC_CFG_RETRYNUM(v)      (((v) & 0xF) << 4)      /* Max. collision retry */
                    231: #define        AC_CFG_SLTTMHI(v)       (((v) & 0x7) << 0)      /* Slot time (high bits) */
                    232:        unsigned char   cfg_byte14;
                    233: #define        AC_CFG_FLGPAD(v)        (((v) & 0x1) << 7)      /* Pad with HDLC flags  */
                    234: #define        AC_CFG_BTSTF(v)         (((v) & 0x1) << 6)      /* Do HDLC bitstuffing  */
                    235: #define        AC_CFG_CRC16(v)         (((v) & 0x1) << 5)      /* 16 bit CCITT CRC     */
                    236: #define        AC_CFG_NCRC(v)          (((v) & 0x1) << 4)      /* Insert no CRC        */
                    237: #define        AC_CFG_TNCRS(v)         (((v) & 0x1) << 3)      /* Tx even if no carrier */
                    238: #define        AC_CFG_MANCH(v)         (((v) & 0x1) << 2)      /* Manchester coding    */
                    239: #define        AC_CFG_BCDIS(v)         (((v) & 0x1) << 1)      /* Disable broadcast    */
                    240: #define        AC_CFG_PRM(v)           (((v) & 0x1) << 0)      /* Promiscuous mode     */
                    241:        unsigned char   cfg_byte15;
                    242: #define        AC_CFG_ICDS(v)          (((v) & 0x1) << 7)      /* Internal collision   */
                    243:                                                        /* detect source        */
                    244: #define        AC_CFG_CDTF(v)          (((v) & 0x7) << 4)      /* Collision detect     */
                    245:                                                        /* filter in bit times  */
                    246: #define        AC_CFG_ICSS(v)          (((v) & 0x1) << 3)      /* Internal carrier     */
                    247:                                                        /* sense source         */
                    248: #define        AC_CFG_CSTF(v)          (((v) & 0x7) << 0)      /* Carrier sense        */
                    249:                                                        /* filter in bit times  */
                    250:        unsigned short  cfg_min_frm_len;
                    251: #define        AC_CFG_MNFRM(v)         (((v) & 0xFF) << 0)     /* Min. bytes/frame (<= 255) */
                    252: };
                    253: 
                    254: /*
                    255:  * The MC-Setup Action Command.
                    256:  */
                    257: typedef struct ac_mcs_t        ac_mcs_t;
                    258: struct ac_mcs_t
                    259: {
                    260:        ach_t           mcs_h;
                    261:        unsigned short  mcs_cnt;        /* No. of bytes of MC addresses */
                    262: #if 0
                    263:        unsigned char   mcs_data[ADDR_LEN]; /* The first MC address ..  */
                    264:        ...
                    265: #endif
                    266: };
                    267: 
                    268: #define I82586_MAX_MULTICAST_ADDRESSES 128     /* Hardware hashed filter */
                    269: 
                    270: /*
                    271:  * The Transmit Action Command.
                    272:  */
                    273: typedef struct ac_tx_t ac_tx_t;
                    274: struct ac_tx_t
                    275: {
                    276:        ach_t           tx_h;
                    277:        unsigned short  tx_tbd_offset;  /* Address of list of buffers.  */
                    278: #if    0
                    279: Linux packets are passed down with the destination MAC address
                    280: and length/type field already prepended to the data,
                    281: so we do not need to insert it.  Consistent with this
                    282: we must also set the AC_CFG_ALOC(..) flag during the
                    283: ac_cfg_t action command.
                    284:        unsigned char   tx_addr[ADDR_LEN]; /* The frame dest. address   */
                    285:        unsigned short  tx_length;      /* The frame length             */
                    286: #endif /* 0 */
                    287: };
                    288: 
                    289: /*
                    290:  * The Time Domain Reflectometer Action Command.
                    291:  */
                    292: typedef struct ac_tdr_t        ac_tdr_t;
                    293: struct ac_tdr_t
                    294: {
                    295:        ach_t           tdr_h;
                    296:        unsigned short  tdr_result;     /* Result.      */
                    297: #define                AC_TDR_LNK_OK   (0x1 << 15)     /* No link problem      */
                    298: #define                AC_TDR_XCVR_PRB (0x1 << 14)     /* Txcvr cable problem  */
                    299: #define                AC_TDR_ET_OPN   (0x1 << 13)     /* Open on the link     */
                    300: #define                AC_TDR_ET_SRT   (0x1 << 12)     /* Short on the link    */
                    301: #define                AC_TDR_TIME     (0x7FF << 0)    /* Distance to problem  */
                    302:                                                /* site in transmit     */
                    303:                                                /* clock cycles         */
                    304: };
                    305: 
                    306: /*
                    307:  * The Dump Action Command.
                    308:  */
                    309: typedef struct ac_dmp_t        ac_dmp_t;
                    310: struct ac_dmp_t
                    311: {
                    312:        ach_t           dmp_h;
                    313:        unsigned short  dmp_offset;     /* Result.      */
                    314: };
                    315: 
                    316: /*
                    317:  * Size of the result of the dump command.
                    318:  */
                    319: #define        DUMPBYTES       170
                    320: 
                    321: /*
                    322:  * The Diagnose Action Command.
                    323:  */
                    324: typedef struct ac_dgn_t        ac_dgn_t;
                    325: struct ac_dgn_t
                    326: {
                    327:        ach_t           dgn_h;
                    328: };
                    329: 
                    330: /*
                    331:  * Transmit Buffer Descriptor (TBD).
                    332:  */
                    333: typedef struct tbd_t   tbd_t;
                    334: struct tbd_t
                    335: {
                    336:        unsigned short  tbd_status;             /* Written by the CPU   */
                    337: #define                TBD_STATUS_EOF  (0x1 << 15)     /* This TBD is the      */
                    338:                                                /* last for this frame  */
                    339: #define                TBD_STATUS_ACNT (0x3FFF << 0)   /* Actual count of data */
                    340:                                                /* bytes in this buffer */
                    341:        unsigned short  tbd_next_bd_offset;     /* Next in list         */
                    342:        unsigned short  tbd_bufl;               /* Buffer address (low) */
                    343:        unsigned short  tbd_bufh;               /*    "      "  (high)  */
                    344: };
                    345: 
                    346: /*
                    347:  * Receive Buffer Descriptor (RBD).
                    348:  */
                    349: typedef struct rbd_t   rbd_t;
                    350: struct rbd_t
                    351: {
                    352:        unsigned short  rbd_status;             /* Written by the 82586 */
                    353: #define                RBD_STATUS_EOF  (0x1 << 15)     /* This RBD is the      */
                    354:                                                /* last for this frame  */
                    355: #define                RBD_STATUS_F    (0x1 << 14)     /* ACNT field is valid  */
                    356: #define                RBD_STATUS_ACNT (0x3FFF << 0)   /* Actual no. of data   */
                    357:                                                /* bytes in this buffer */
                    358:        unsigned short  rbd_next_rbd_offset;    /* Next rbd in list     */
                    359:        unsigned short  rbd_bufl;               /* Data pointer (low)   */
                    360:        unsigned short  rbd_bufh;               /*  "      "    (high)  */
                    361:        unsigned short  rbd_el_size;            /* EL+Data buf. size    */
                    362: #define                RBD_EL  (0x1 << 15)             /* This BD is the       */
                    363:                                                /* last in the list     */
                    364: #define                RBD_SIZE (0x3FFF << 0)          /* No. of bytes the     */
                    365:                                                /* buffer can hold      */
                    366: };
                    367: 
                    368: #define        rbdoff(p,f)     toff(rbd_t, p, f)
                    369: 
                    370: /*
                    371:  * Frame Descriptor (FD).
                    372:  */
                    373: typedef struct fd_t    fd_t;
                    374: struct fd_t
                    375: {
                    376:        unsigned short  fd_status;              /* Written by the 82586 */
                    377: #define                FD_STATUS_C     (0x1 << 15)     /* Completed storing frame */
                    378: #define                FD_STATUS_B     (0x1 << 14)     /* FD was consumed by RU */
                    379: #define                FD_STATUS_OK    (0x1 << 13)     /* Frame rxd successfully */
                    380: #define                FD_STATUS_S11   (0x1 << 11)     /* CRC error            */
                    381: #define                FD_STATUS_S10   (0x1 << 10)     /* Alignment error      */
                    382: #define                FD_STATUS_S9    (0x1 <<  9)     /* Ran out of resources */
                    383: #define                FD_STATUS_S8    (0x1 <<  8)     /* Rx DMA overrun       */
                    384: #define                FD_STATUS_S7    (0x1 <<  7)     /* Frame too short      */
                    385: #define                FD_STATUS_S6    (0x1 <<  6)     /* No EOF flag          */
                    386:        unsigned short  fd_command;             /* Command              */
                    387: #define                FD_COMMAND_EL   (0x1 << 15)     /* Last FD in list      */
                    388: #define                FD_COMMAND_S    (0x1 << 14)     /* Suspend RU after rx  */
                    389:        unsigned short  fd_link_offset;         /* Next FD              */
                    390:        unsigned short  fd_rbd_offset;          /* First RBD (data)     */
                    391:                                                /* Prepared by CPU,     */
                    392:                                                /* updated by 82586     */
                    393: #if    0
                    394: I think the rest is unused since we
                    395: have set AC_CFG_ALOC(..).  However, just
                    396: in case, we leave the space.
                    397: #endif /* 0 */
                    398:        unsigned char   fd_dest[ADDR_LEN];      /* Destination address  */
                    399:                                                /* Written by 82586     */
                    400:        unsigned char   fd_src[ADDR_LEN];       /* Source address       */
                    401:                                                /* Written by 82586     */
                    402:        unsigned short  fd_length;              /* Frame length or type */
                    403:                                                /* Written by 82586     */
                    404: };
                    405: 
                    406: #define        fdoff(p,f)      toff(fd_t, p, f)
                    407: 
                    408: /*
                    409:  * This software may only be used and distributed
                    410:  * according to the terms of the GNU Public License.
                    411:  *
                    412:  * For more details, see wavelan.c.
                    413:  */

unix.superglobalmegacorp.com

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