home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / KERNEL-S / V1.2 / LINUX-1.2 / LINUX-1 / linux / drivers / net / i82586.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-31  |  13.8 KB  |  411 lines

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