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

VxWorks

开发平台:

C/C++

  1. /* if_enp.h - CMC ENP 10/L network interface header */
  2. /* Copyright 1984-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,03mar93,ccc  changed BYTE_ORDER, LITTLE_ENDIAN to _BYTE_ORDER,
  7.  _LITTLE_ENDIAN, SPR 2057.
  8. 01i,22sep92,rrr  added support for c++
  9. 01h,26may92,rrr  the tree shuffle
  10. 01g,04oct91,rrr  passed through the ansification filter
  11.   -changed READ, WRITE and UPDATE to O_RDONLY O_WRONLY and O_RDWR
  12.   -changed copyright notice
  13. 01f,18jun91,km   added O_WRONLY/READLONG macro and pragma for 960.
  14. 01e,22oct90,gae  added BCB transmit and receive bits; reworked ENPSTAT.
  15. 01d,05oct90,shl  added copyright notice.
  16. 01c,13apr89,del  added ENPDEVICE structure to be compatible with CMC
  17.  Link-10 v4.0 roms.
  18. 01c,04aug88,dnw  added enp_status and associated values.
  19. 01b,19nov87,dnw  added e_intvector
  20. 01a,27jul87,rdc  adapted from cmc's 4.2 driver.
  21. */
  22. #ifndef __INCif_enph
  23. #define __INCif_enph
  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif
  27. /*
  28.  * Since the ENP-10/L supports only 16 bit data accesses,
  29.  * use the following macros to access 32 bit values.
  30.  */
  31. #if _BYTE_ORDER == _LITTLE_ENDIAN
  32. #define WRITELONG(addr, value) *(short *) addr = (unsigned) value & 0xffff; 
  33.       *((short *) addr + 1) = (unsigned) value >> 16;
  34. #define READLONG(source, dest) *(short *) dest = *(short *) source; 
  35. *((short *) dest + 1) = *((short *) source + 1);
  36. #else
  37. #define WRITELONG(addr, value) *(short *) addr = (unsigned) value >> 16; 
  38.       *((short *) addr + 1) = (unsigned) value & 0xffff;
  39. #define READLONG(source, dest) *(short *) dest = *(short *)source; 
  40. *((short *) dest + 1) = *((short *) source + 1);
  41. #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
  42. #define ENPSTART 0xf02000 /* standard enp start addr */
  43. #define K *1024
  44. #define ENP_BSS_SIZE 0x102
  45. #define ENPSIZE (124 K) /* VME bus space allocated to enp */
  46. #define MINPKTSIZE 60 /* minimum ethernet packet size */
  47. /* Note: paged window (4 K) is identity mapped by ENP kernel to provide
  48.  * 124 K contiguous RAM (as reflected in RAM_SIZE
  49.  */
  50. #define RAM_WINDOW (128 K)
  51. #define IOACCESS_WINDOW (4 K)
  52. #define FIXED_WINDOW (RAM_WINDOW - IOACCESS_WINDOW)
  53. #define RAMROM_SWAP (4 K)
  54. #define RAM_SIZE (FIXED_WINDOW - RAMROM_SWAP)
  55. #define HOST_RAMSIZE (48 K)
  56. #define ENP_RAMSIZE (20 K)
  57. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  58. #pragma align 1                 /* tell gcc960 not to optimize alignments */
  59. #endif  /* CPU_FAMILY==I960 */
  60. /* ...top of 4K local i/o space for ENP */
  61. typedef struct iow10 {
  62. char pad1[0x81];
  63. /* written to: causes an interrupt on the host at the vector written
  64.    read from : returns the most significant 8 bits of the slave address */
  65. char vector;
  66. char pad2[0x1F];
  67. char csrarr[0x1E];
  68. char pad3[2];
  69. char ier; /* intr. enable reg., 0x80 == enable,0 == off*/
  70. char pad4[1];
  71. char tir; /* transmit intr. (Level 4 INP autovector) */
  72. char pad5[1];
  73. char rir; /* receive intr. (Level 5 INP autovector) */
  74. char pad6[1];
  75. char uir; /* utility intr. (Level 1 INP autovector) */
  76. char pad7[7];
  77. char mapfirst4k; /* bit 7 set means ram, clear means rom */
  78. char pad8[0x11];
  79. char exr; /* exception register, see bit defines above */
  80. char pad9[0xD1F];
  81. char hst2enp_interrupt; /* R or W interrupts ENP */
  82. char pad10[0xFF];
  83. char hst2enp_reset; /* R or W resets ENP */
  84. } iow10;
  85. typedef struct
  86.     {
  87.     u_char enaddr[6];
  88.     } ETHADDR;
  89. typedef struct
  90.     {
  91.     int e_listsize; /* active address entries */
  92.     ETHADDR e_baseaddr; /* address LANCE is working with */
  93.     ETHADDR e_addrs [16]; /* possible addresses */
  94.     } ETHLIST;
  95. typedef struct enpstat
  96.     {
  97. #define e_xmit_successful e_stat[0] /* successful transmissions */
  98. #define e_mult_retry e_stat[1] /* multiple retries on xmit */
  99. #define e_one_retry e_stat[2] /* single retries */
  100. #define e_fail_retry e_stat[3] /* too many retries */
  101. #define e_deferrals e_stat[4] /* trsm. delayed due to active medium */
  102. #define e_xmit_buff_err e_stat[5] /* xmit data chaining failed - can't happen */
  103. #define e_silo_underrun e_stat[6] /* transmit data fetch failed */
  104. #define e_late_coll e_stat[7] /* collision after xmit */
  105. #define e_lost_carrier e_stat[8]
  106. #define e_babble e_stat[9] /* xmit length > 1518 */
  107. #define e_no_heartbeat e_stat[10]  /* transceiver mismatch -- not an error */
  108. #define e_xmit_mem_err e_stat[11]
  109. #define e_rcv_successful e_stat[12] /* good receptions */
  110. #define e_rcv_missed e_stat[13] /* no recv buff available */
  111. #define e_crc_err e_stat[14] /* checksum failed */
  112. #define e_frame_err e_stat[15]  /* crc error AND data length != 0 mod 8 */
  113. #define e_rcv_buff_err e_stat[16]  /* rcv data chain failure - can't happen */
  114. #define e_silo_overrun e_stat[17] /* receive data store failed */
  115. #define e_rcv_mem_err e_stat[18]
  116.     ULONG e_stat [19];
  117.     } ENPSTAT;
  118. typedef struct
  119.     {
  120.     short r_rdidx;
  121.     short r_wrtidx;
  122.     short r_size;
  123.     short r_pad;
  124.     int r_slot [1];
  125.     } RING;
  126. typedef struct
  127.     {
  128.     short r_rdidx;
  129.     short r_wrtidx;
  130.     short r_size;
  131.     short r_pad; /* to make VAXen happy */
  132.     int   r_slot [32];
  133.     } RING32;
  134. /*
  135.  * ENP 10 RAM data layout
  136.  *
  137.  * The two structures that follow are almost identical, the only difference
  138.  * is that the second, ENPDEVICE, contians two extra RING32 fields that
  139.  * CMC decided to add to the middle of the old ENPDEVICE structure
  140.  * (ENPDEVICE_OLD) instead of at the end of the structure, thus
  141.  * making the new structure incompatible with the old structure.
  142.  */
  143. typedef struct {
  144.     char enp_ram_rom[4 K];
  145.     union {
  146. char all_ram[RAM_SIZE];
  147. struct {
  148.     unsigned short t_go;
  149.     unsigned short t_status;
  150.     unsigned int t_pstart;
  151. } t;
  152. struct {
  153.     char nram[RAM_SIZE - (HOST_RAMSIZE + ENP_RAMSIZE)];
  154.     char hram[HOST_RAMSIZE];
  155.     char kram[ENP_RAMSIZE];
  156. } u_ram;
  157. struct {
  158.     char pad7[ 0x100 ]; /* starts 0x1100 - 0x2000 */
  159.     short e_enpstate;
  160.     short e_enpmode;
  161.     UINT e_enpbase;
  162.     short e_enprun;
  163.     short e_intvector;
  164.     RING32 h_toenp;
  165.     RING32 h_hostfree;
  166.     RING32 e_tohost;
  167.     RING32  e_enpfree;
  168.     ENPSTAT e_stat;
  169.     ETHLIST e_netaddr;
  170. } iface;
  171.     } enp_u;
  172.     iow10 enp_iow;
  173.     } ENPDEVICE_OLD; /* cmc link-10 v3.x */
  174. typedef struct
  175.     {
  176.     char enp_ram_rom[4 K];
  177.     union {
  178. char all_ram[RAM_SIZE];
  179. struct
  180.     {
  181.     USHORT t_go;
  182.     USHORT t_status;
  183.     UINT t_pstart;
  184.     } t;
  185. struct
  186.     {
  187.     char nram[RAM_SIZE - (HOST_RAMSIZE + ENP_RAMSIZE)];
  188.     char hram[HOST_RAMSIZE];
  189.     char kram[ENP_RAMSIZE];
  190.     } u_ram;
  191. struct
  192.     {
  193.     char pad7[ 0x100 ]; /* starts 0x1100 - 0x2000 */
  194.     short e_enpstate;
  195.     short e_enpmode;
  196.     UINT e_enpbase;
  197.     short e_enprun;
  198.     short e_intvector;
  199.     RING32 h_toenp;
  200.     RING32 h_hostfree;
  201.     RING32 e_tohost;
  202.     RING32  e_enpfree;
  203.     RING32 e_rcvdma;
  204.     RING32 h_rcv_d;
  205.     ENPSTAT e_stat;
  206.     ETHLIST e_netaddr;
  207.     } iface;
  208. } enp_u;
  209.     struct iow10 enp_iow;
  210.     } ENPDEVICE; /* cmc link-10 v4.0 */
  211. #define enp_ram enp_u.all_ram
  212. #define enp_nram enp_u.u_ram.nram
  213. #define enp_hram enp_u.u_ram.hram
  214. #define enp_kram enp_u.u_ram.kram
  215. #define enp_go enp_u.t.t_go
  216. #define enp_status enp_u.t.t_status
  217. #define enp_prog_start enp_u.t.t_pstart
  218. #define enp_state enp_u.iface.e_enpstate
  219. #define enp_mode enp_u.iface.e_enpmode
  220. #define enp_base enp_u.iface.e_enpbase
  221. #define enp_enprun enp_u.iface.e_enprun
  222. #define enp_intvector enp_u.iface.e_intvector
  223. #define enp_toenp enp_u.iface.h_toenp
  224. #define enp_hostfree enp_u.iface.h_hostfree
  225. #define enp_tohost enp_u.iface.e_tohost
  226. #define enp_enpfree enp_u.iface.e_enpfree
  227. #define enp_stat enp_u.iface.e_stat
  228. #define enp_addr enp_u.iface.e_netaddr
  229. #define ENPVAL 0xff /* value to poke in enp_iow.hst2enp_interrupt */
  230. #define RESETVAL 0x00 /* value to poke in enp_iow.enp2hst_clear_intr*/
  231. #define GOVAL 0x8080 /* value to poke in enp_go */
  232. #define INTR_ENP(addr) addr->enp_iow.hst2enp_interrupt = ENPVAL
  233. #define ACK_ENP_INTR(addr)
  234. #define IS_ENP_INTR(addr) 1
  235. #define RESET_ENP(addr) addr->enp_iow.hst2enp_reset = 01
  236. #define ENP_GO(addr,start) {  
  237.   int goval = 0x80800000; 
  238.   WRITELONG(&addr->enp_prog_start, start) 
  239.   WRITELONG(&addr->enp_go, goval) 
  240. }
  241. /*
  242.  * status bits - in t_status for 3.1 t_csr for 4.0
  243.  */
  244. #define STS_ONLINE 0x02 /* set when GO command received */
  245. #define STS_READY 0x04 /* set when ready for GO command */
  246. #define STS_NO_PROM 0x08 /* don't go to PROM address */
  247. #define STS_INT_ENABLE 0x40 /* enable enp interrupts */
  248. /*
  249.  * state bits
  250.  */
  251. #define S_ENPRESET 01 /* enp is in reset state */
  252. #define S_ENPRUN 02 /* enp is in run state */
  253. /*
  254.  * mode bits
  255.  */
  256. #define E_SWAP16 0x1 /* swap two octets within 16 */
  257. #define E_SWAP32 0x2 /* swap 16s within 32 */
  258. #define E_SWAPRD 0x4 /* swap on read */
  259. #define E_SWAPWRT 0x8 /* swap on write */
  260. #define E_DMA 0x10 /* enp does data moving */
  261. #define E_EXAM_LIST 0x80000000 /* enp should examine addr list */
  262. typedef struct BCB /* Data Buffer Structure */
  263.     {
  264.     struct BCB    *b_link;
  265.     unsigned short b_stat;
  266.     short          b_len;
  267.     char          *b_addr;
  268.     short          b_msglen;
  269.     short          b_reserved;
  270.     } BCB;
  271. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  272. #pragma align 0                 /* turn off alignment requirement */
  273. #endif  /* CPU_FAMILY==I960 */
  274. /*
  275.  * transmit & receive status bits
  276.  */
  277. #define BCB_DONE 0x8000 /* buffer complete */
  278. #define BCB_ERR 0x4000 /* error occurred */
  279. #define BCB_FILL 0x2000 /* TX: store chip address outgo */
  280. #define BCB_FRAME 0x2000 /* RX: framing error */
  281. #define BCB_MORE 0x1000 /* TX: more than one retry */
  282. #define BCB_OFLO 0x1000 /* RX: silo overflow */
  283. #define BCB_ONE 0x0800 /* TX: one retry required */
  284. #define BCB_CRC 0x0800 /* RX: CRC error */
  285. #define BCB_DEFER 0x0400 /* TX: cable busy */
  286. #define BCB_RXBUF 0x0400 /* RX: receive buffer error */
  287. #define BCB_STP 0x0200 /* start of packet */
  288. #define BCB_ENP 0x0100 /* end of packet */
  289. #define BCB_TXBUF 0x0080 /* TX: transmit buffer error */
  290. #define BCB_UFLO 0x0040 /* TX: transmit silo underflow */
  291. #define BCB_BABBLE 0x0020 /* TX: transmit babbling */
  292. #define BCB_LATCOL 0x0010 /* TX: late collision */
  293. #define BCB_CARRLOSS 0x0008 /* TX: carrier lost */
  294. #define BCB_RETRY 0x0004 /* TX: missed packet */
  295. #define BCB_MEMERR 0x0002 /* memory error */
  296. #define BCB_COLERR 0x0001 /* TX: collision error */
  297. #define BCB_MISSED 0x0001 /* RX: missed packet */
  298. #ifdef __cplusplus
  299. }
  300. #endif
  301. #endif /* __INCif_enph */