ln7990End.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ln7990End.h - END based AMD LANCE Ethernet header */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01f,22sep98,dat  Fixed lint warnings in LN_RMD_TO_ADDR by adding parens
  7. 01e,02jun97,gnn  Changed LN_TMD_TO_ADDR to take into account Force 30 issue.
  8. 01d,21jan97,gnn  Added LN_TMD_TO_ADDR to map a address from a TMD.
  9. 01c,13nov96,dat  Removed LN_REGS.
  10. 01b,22oct96,gnn  moved some stuff to ln7990EndCommon.h
  11.                  added macros for accesses to registers
  12.                  cleaned up some structs and unions.
  13. 01a,15aug96,gnn  copied from if_ln.h.
  14. */
  15. #ifndef __INCln7990Endh
  16. #define __INCln7990Endh
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. /*
  21.  * Control block definitions for AMD LANCE (Ethernet) chip.
  22.  * This has some of the same (mis)features as the Intel 82586 with
  23.  * regards to byte ordering.  It assumes that a memory address specifies
  24.  * the location of the least significant byte of a multi-byte value.  This
  25.  * is correct for most Intel & DEC processors, but is wrong for 680x0s.
  26.  * As a result, all addresses specified to the chip must have their
  27.  * words swapped.  At least it has a control bit to automatically swap
  28.  * bytes during data transfer dma.  (The 82586 is much worse.)
  29.  */
  30. /*
  31.  * Initialization Block.
  32.  * Specifies addresses of receive and transmit descriptor rings.
  33.  */
  34. typedef struct lnIB
  35.     {
  36.     u_short lnIBMode; /* mode register */
  37.     char lnIBPadr [6]; /* PADR: byte swapped ethernet physical address */
  38. /* LADRF: logical address filter */
  39.     u_short lnIBLadrfLow; /* least significant word */
  40.     u_short lnIBLadrfMidLow; /* low middle word */
  41.     u_short lnIBLadrfMidHigh;   /* high middle word */
  42.     u_short lnIBLadrfHigh; /* most significant word */
  43. /* RDRA: read ring address */
  44.     u_short lnIBRdraLow; /* low word */
  45.     u_short lnIBRdraHigh; /* high word */
  46. /* TDRA: transmit ring address */
  47.     u_short lnIBTdraLow; /* low word */
  48.     u_short lnIBTdraHigh; /* high word */
  49.     } ln_ib;
  50. /*
  51.  * Receive Message Descriptor Entry.
  52.  * Four words per entry.  Number of entries must be a power of two.
  53.  */
  54. typedef struct lnRMD
  55.     {
  56.     u_short lnRMD0; /* bits 15:00 of receive buffer address */
  57.     u_short lnRMD1;         /* bits 23:16 of receive buffer address */
  58.     u_short lnRMD2; /* buffer byte count (negative) */
  59.     u_short lnRMD3; /* message byte count */
  60.     } ln_rmd;
  61. #define rbuf_ladr lnRMD0
  62. #define rbuf_hadr lnRMD1
  63. #define rbuf_bcnt lnRMD2
  64. #define rbuf_mcnt lnRMD3
  65. /*
  66.  * Transmit Message Descriptor Entry.
  67.  * Four words per entry.  Number of entries must be a power of two.
  68.  */
  69. typedef struct lnTMD
  70.     {
  71.     u_short lnTMD0; /* bits 15:00 of transmit buffer address */
  72.     union
  73. {
  74.         u_short     lnTMD1; /* bits 23:16 of transmit buffer address */
  75. u_short     ln_tmd1b;
  76. } ln_tmd1;
  77.     u_short lnTMD2; /* message byte count */
  78.     union
  79. {
  80. u_short     lnTMD3; /* errors */
  81. u_short     lntmd3b;
  82.         } ln_tmd3;
  83.     } ln_tmd;
  84. #define tbuf_ladr lnTMD0
  85. #define tbuf_hadr ln_tmd1.lnTMD1
  86. #define tbuf_stat ln_tmd1.lnTMD1
  87. #define tbuf_bcnt lnTMD2
  88. #define tbuf_err ln_tmd3.lnTMD3
  89. /* Definitions for fields and bits in the LN_REGS */
  90. #define lnrmd1_OWN      0x8000          /* Own */
  91. #define lnrmd1_ERR      0x4000          /* Error */
  92. #define lnrmd1_FRAM     0x2000          /* Framming Error */
  93. #define lnrmd1_OFLO     0x1000          /* Overflow */
  94. #define lnrmd1_CRC      0x0800          /* CRC */
  95. #define lnrmd1_BUFF     0x0400          /* Buffer Error */
  96. #define lnrmd1_STP      0x0200          /* Start of Packet */
  97. #define lnrmd1_ENP      0x0100          /* End of Packet */
  98. #define lnrmd1_HADR     0x00FF          /* High Address */
  99. #define lntmd1_OWN      0x8000          /* Own */
  100. #define lntmd1_ERR      0x4000          /* Error */
  101. #define lntmd1_MORE     0x1000          /* More than One Retry */
  102. #define lntmd1_ONE      0x0800          /* One Retry */
  103. #define lntmd1_DEF      0x0400          /* Deferred */
  104. #define lntmd1_STP      0x0200          /* Start of Packet */
  105. #define lntmd1_ENP      0x0100          /* End of Packet */
  106. #define lntmd1_HADR     0x00FF          /* High Address */
  107. #define lntmd3_BUFF     0x8000          /* Buffer Error */
  108. #define lntmd3_UFLO     0x4000          /* Underflow Error */
  109. #define lntmd3_LCOL     0x1000          /* Late Collision */
  110. #define lntmd3_LCAR     0x0800          /* Lost Carrier */
  111. #define lntmd3_RTRY     0x0400          /* Retry Error */
  112. #define lntmd3_TDR      0x03FF          /* Time Domain Reflectometry */
  113. /*
  114.  * Generic shared memory read and write macros.
  115.  */
  116. #ifndef SHMEM_RD
  117. #    define SHMEM_RD(x) *(x)
  118. #endif
  119. #ifndef SHMEM_WR
  120. #    define SHMEM_WR(x,y) (*(x) = y)
  121. #endif
  122. /*
  123.  * Macros for read and write descriptors.
  124.  *
  125.  */
  126. #define LN_RMD_BUF_TO_ADDR(rmd, tmp, buf) 
  127. tmp = LN_CACHE_VIRT_TO_PHYS (buf); 
  128. rmd->rbuf_ladr = (u_long) tmp;
  129. rmd->rbuf_hadr = (((u_long) tmp >> 16) & lnrmd1_HADR) | lnrmd1_OWN;
  130. #define LN_TMD_BUF_TO_ADDR(tmd, tmp, buf) 
  131. tmp = LN_CACHE_VIRT_TO_PHYS (buf); 
  132. tmd->tbuf_ladr = (u_long) tmp;
  133. tmd->tbuf_hadr = (u_long) tmp >> 16;
  134. #define LN_TMD_TO_ADDR(tmd, addr) 
  135. addr = (tmd->tbuf_ladr | (tmd->tbuf_hadr << 16)) & 0x00ffffff;
  136. #define LN_RMD_TO_ADDR(pool, rmd, addr) 
  137. addr = (((ULONG)pool & 0xff000000) | 
  138.             ((rmd->rbuf_ladr | (rmd->rbuf_hadr << 16)) & 0x00ffffff));
  139. #define LN_ADDR_TO_RMD(addr, rmd) 
  140. rmd->rbuf_ladr = addr; 
  141. rmd->rbuf_hadr = (addr >> 16) & lnrmd1_HADR;
  142. #define LN_CLEAN_RXD(rmd) 
  143. pRmd->rbuf_hadr &= 0xff;
  144. pRmd->rbuf_mcnt = 0; 
  145. pRmd->lnRMD1 |= lnrmd1_OWN; 
  146. #define LN_ADDR_TO_IB_RMD(addr, ib, rsize) 
  147. ib->lnIBRdraLow = (u_long) addr; 
  148. ib->lnIBRdraHigh = (((u_long) addr >> 16) & 0xff) | (rsize << 13);
  149. #define LN_ADDR_TO_IB_TMD(addr, ib, tsize) 
  150. ib->lnIBTdraLow = (u_long) addr; 
  151. ib->lnIBTdraHigh = (((u_long) addr >> 16) & 0xff) | (tsize << 13);
  152. #define LN_RMD_OWNED(rmd) 
  153. (rmd->lnRMD1 & lnrmd1_OWN)
  154. #define LN_ADDRF_CLEAR(ib) 
  155. ib->lnIBLadrfLow = 0; 
  156. ib->lnIBLadrfMidLow = 0; 
  157. ib->lnIBLadrfMidHigh = 0; 
  158. ib->lnIBLadrfHigh = 0;
  159. #define LN_ADDRF_SET(ib, crc) 
  160. switch (crc >> 4)
  161.     {
  162.     case 0:
  163. pIb->lnIBLadrfLow |= 1 << (crc & 0xf);
  164. break;
  165.     case 1:
  166. pIb->lnIBLadrfMidLow |= 1 << (crc & 0xf);
  167. break;
  168.     case 2:
  169. pIb->lnIBLadrfMidHigh |= 1 << (crc & 0xf);
  170. break;
  171.     case 3:
  172. pIb->lnIBLadrfHigh |= 1 << (crc & 0xf);
  173. break;
  174.     default:
  175. break;
  176.     }
  177. #define LN_PKT_LEN_GET(rmd) 
  178. pRmd->rbuf_mcnt - 4;
  179. #define LN_RMD_ERR(rmd) 
  180. (rmd->lnRMD1 & lnrmd1_ERR) || 
  181. (rmd->lnRMD1 & (lnrmd1_STP | lnrmd1_ENP)) != 
  182.        (lnrmd1_STP | lnrmd1_ENP))
  183. #define LN_TMD_CLR_ERR(tmd) 
  184. tmd->tbuf_stat &= lnrmd1_HADR
  185. #ifdef __cplusplus
  186. }
  187. #endif
  188. #endif /* __INCln7990Endh */