idt32438End.h
上传用户:yingyi0918
上传日期:2022-06-26
资源大小:214k
文件大小:32k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*  idt32438End.h - Ethernet END Driver header for IDT RC32438*/
  2.  
  3. /* Copyright 1984-2002 Wind River Systems, Inc. */
  4. #include "copyright_wrs.h"
  5. /*
  6.  * This file has been developed or significantly modified by the
  7.  * MIPS Center of Excellence Dedicated Engineering Staff.
  8.  * This notice is as per the MIPS Center of Excellence Master Partner
  9.  * Agreement, do not remove this notice without checking first with
  10.  * WR/Platforms MIPS Center of Excellence engineering management.
  11.  */
  12. /*
  13. modification history
  14. --------------------
  15. 01b,25jul02,slk  SPR 80131 and also general code clean up
  16. 01b,11jul02,pgh  Significant re-write and clean up.
  17. 01a,19Jun02,d_c  Code from IDT modified to approach C of E standards.
  18. */
  19. /*
  20. DESCRIPTION
  21.   
  22. This file is contains definitions for the Ethernet enhanced network driver 
  23. for the IDT RC32438.
  24. */
  25. #ifndef __INCidt32438Endh
  26. #define __INCidt32438Endh
  27. #ifdef __cplusplus
  28. extern "C" {
  29. #endif
  30. /* ethernet frame and MAC size */
  31. #define EH_SIZE             14
  32. #define ETH_CRC_LEN         4
  33. #define ETH_MAX_FRAME_SIZE  (ETHERMTU + EH_SIZE + ETH_CRC_LEN)
  34. #define ENET_SIZE           6       /* Ethernet address size */
  35. #define IDT438_DEV_NAME     "IDT"   /* name of the device */
  36. #define IDT438_DEV_NAME_LEN 4       /* length of the name string */
  37. #define IDT_UNIT0           0       /* device unit number */
  38. #define IDT_UNIT1           1
  39. #ifndef N_MCAST
  40. #define N_MCAST      64     /* max multicast addresses for this driver */
  41. #endif
  42. #define IDT_BUFSIZ   2048   /* cluster buffer size */
  43. /* General Macros     */
  44. #define MAX(A,B) (((A) > (B)) ? (A) : (B))
  45. #define MIN(A,B) (((A) < (B)) ? (A) : (B))
  46. /* BASE ETHERNET ADDRESS */
  47. #define ETH0_BASE_ADDR 0xB8058000
  48. #define ETH1_BASE_ADDR 0xB8060000
  49. #define DMA0_BASE_ADDR 0xB8040028
  50. #define DMA1_BASE_ADDR 0xB8040050
  51. /* long read and write MACROs handling volatile registers */
  52. #ifndef IDT_LONG_WR
  53. #define IDT_LONG_WR(addr, value)                        
  54.     {                                                   
  55.         *((volatile UINT32 *)(addr)) = (UINT32)(value); 
  56.     }
  57. #endif/* IDT_LONG_WR */
  58. #ifndef IDT_LONG_RD
  59. #define IDT_LONG_RD(addr)    *((volatile UINT32 *)(addr))
  60. #endif/* IDT_LONG_RD */
  61. /* RC32438 Register Base Offsets from Reg Base Addr */
  62. #define IDT_INTC_REG_OFFSET        0x00038000
  63. #define IDT_DMA0_REG_OFFSET        0x00040028
  64. #define IDT_ETH0_REG_OFFSET        0x00058000
  65. #define IDT_DMA1_REG_OFFSET        0x00040050 
  66. #define IDT_ETH1_REG_OFFSET        0x00060000
  67. /* DMA, Interrupt Controller and Ethernet register access macros */
  68. #define IDT_DMA_REGS(pDrvCtrl,reg) 
  69.         ((volatile UINT32 *)((UINT32)(pDrvCtrl->dmaRegBase)+(reg)))
  70. #define IDT_INT_REGS(pDrvCtrl,reg) 
  71.         ((volatile UINT32 *)((UINT32)(pDrvCtrl->intRegBase)+(reg)))
  72. #define IDT_ETH_REGS(pDrvCtrl,reg) 
  73.         ((volatile UINT32 *)((UINT32)(pDrvCtrl->ethRegBase)+(reg)))
  74. /* Ethernet Interrupt Registers                 
  75.  * Notes: During the vxWorks bringup all the IMASK
  76.  * registers should be written with all F's. Once
  77.  * this is done, any subsequent interrupt enable
  78.  * operation would do corresponding mask bit reset.
  79.  * This would ensure non-occurrence of any spurious 
  80.  * interrupt.
  81.  */
  82.  
  83. #define DMA_CHAN2_INT          0x00000004
  84. #define DMA_CHAN3_INT          0x00000008
  85. #define DMA_CHAN4_INT          0x00000010
  86. #define DMA_CHAN5_INT          0x00000020
  87. /* DMA Rx and Tx Interrupt Numbers */
  88. #define DMA_ETHERNET0_RX_INT_NUM    2
  89. #define DMA_ETHERNET0_TX_INT_NUM    3
  90. #define DMA_ETHERNET1_RX_INT_NUM    4
  91. #define DMA_ETHERNET1_TX_INT_NUM    5
  92. /* Interrupt Controller IMASK3 register used to enable and disable
  93.  * interrupts for DMA channels 9 and 10 (ethernet tx and rx)
  94.  */
  95. #define IDT_IMASK3_CONTROL(pDrvCtrl)    IDT_INT_REGS(pDrvCtrl,0x14)
  96. /* Interrupt Controller Mask 3, Enable and Disable Ethernet Tx and Rx */
  97.  
  98. #define DMA_INT_ENABLE(pDrvCtrl)                             
  99.     {                                                        
  100.     volatile UINT32 temp ;                                   
  101.     temp = INTERRUPT.i3.imask;                               
  102.     if(pDrvCtrl->unit == 0)               
  103.         temp = (temp & (~(DMA_CHAN2_INT | DMA_CHAN3_INT)));  
  104.     else                                                     
  105. temp = (temp & (~(DMA_CHAN4_INT | DMA_CHAN5_INT ))); 
  106.     INTERRUPT.i3.imask = temp  ;                             
  107.     temp = INTERRUPT.i3.imask  ;                             
  108.     }
  109. #define DMA_INT_DISABLE(pDrvCtrl)                            
  110.     {                                                        
  111.     volatile UINT32 temp ;                                   
  112.     temp =  INTERRUPT.i3.imask;                              
  113.     if(pDrvCtrl->unit == 0)               
  114.         temp = (temp | ((DMA_CHAN2_INT | DMA_CHAN3_INT )));  
  115.     else                                                     
  116.     temp = (temp | ((DMA_CHAN4_INT | DMA_CHAN5_INT )));      
  117.     INTERRUPT.i3.imask = temp ;                              
  118.     temp = INTERRUPT.i3.imask ;                              
  119.     }
  120.  
  121. /* Interrupt Controller IMask5 Register.  Controls enable/disable
  122.  * of ethernet input overflow and output underflow interrupts.
  123.  */
  124. #define IDT_IMASK5_CONTROL(pDrvCtrl)    IDT_INT_REGS(pDrvCtrl,0x2c)
  125. /* output underflow and input overflow interrupt IMASK5 bits */
  126. #define ETH0FIFOS_INPUT_OVERFLOW      0x00001000
  127. #define ETH0FIFOS_OUTPUT_UNDERFLOW    0x00002000
  128. #define ETH1FIFOS_INPUT_OVERFLOW      0x00008000
  129. #define ETH1FIFOS_OUTPUT_UNDERFLOW    0x00010000
  130. /*  Ethernet Receive DMA defines : DMA Channel 9 
  131.  *  Notes: The DMA_RX_CONTROL should be written with
  132.  *  a value of 0x0000 0009 at the initialization, which
  133.  *  selects the transfer request mode, resets the DONE 
  134.  *  MASK, and has no effect on the RUN bit.The DMA Status 
  135.  *  Status Mask register need to be zeroed during 
  136.  *  initialization. Subsequently, set the DMA Status Mask
  137.  *  to receive all the interrupts ( To help Debug ) though
  138.  *  only DONE would be important in Receive and FINISH in
  139.  *  the case of Transmit. Also, during initialization,
  140.  *  write all zero's to DPTR and NDPTR.
  141.  */  
  142. #define DMA_RX_CONTROL(pDrvCtrl)   IDT_DMA_REGS(pDrvCtrl,0x00)   
  143.                                              /* DMA 2/4 control register */
  144. #define DMA_RX_CNT_MODE     0x00000008
  145. #define DMA_RX_CNT_RUN      0x00000001
  146. #define DMA_RX_CNT_VAL      0x00000009
  147. #define DMA_RX_CONTROL_RD(pDrvCtrl)     
  148.                 (*((volatile UINT32 *)DMA_RX_CONTROL(pDrvCtrl)))
  149. #define DMA_RX_CONTROL_WR(pDrvCtrl,val)  
  150.                 (*((volatile UINT32 *)DMA_RX_CONTROL(pDrvCtrl)) = (val | 0x8))
  151. #define DMA_TXRX_RUN        0x1
  152. #define DMA_RX_STATUS(pDrvCtrl)  
  153.                 IDT_DMA_REGS(pDrvCtrl,0x04)   /* DMA2/4 status register */
  154. #define DMA_RX_FINISHED     0x00000001
  155. #define DMA_RX_DONE         0x00000002
  156. #define DMA_RX_CHAIN        0x00000004
  157. #define DMA_RX_ERROR        0x00000008
  158. #define DMA_RX_HALT         0x00000010
  159. #define DMA_RX_STATUS_RD(pDrvCtrl)    
  160.                 (*((volatile UINT32 *)DMA_RX_STATUS(pDrvCtrl)))
  161. #define DMA_RX_STATUS_WR(pDrvCtrl,val) 
  162.                 (*((volatile UINT32 *)DMA_RX_STATUS(pDrvCtrl)) = (val))
  163. #define DMA_RX_STATUS_MASK(pDrvCtrl)  
  164.                 IDT_DMA_REGS(pDrvCtrl,0x08) /* DMA 2/4 status mask register */
  165. #define DMA_RX_SMASK_VAL    
  166.                 (DMA_RX_ERROR | DMA_RX_FINISHED | DMA_RX_DONE | DMA_RX_HALT)
  167.  
  168. #define ETH_DMA_RX_INT_ENABLE(pDrvCtrl)       
  169.     {                                       
  170.     volatile UINT32 temp ;                  
  171.     temp = (UINT32)(~( DMA_RX_SMASK_VAL) ); 
  172.     *((volatile UINT32 *)DMA_RX_STATUS_MASK(pDrvCtrl))&=temp;
  173.     temp= *((volatile UINT32 *)DMA_RX_STATUS_MASK(pDrvCtrl)) ;
  174.     }
  175. #define ETH_DMA_RX_INT_DISABLE(pDrvCtrl)       
  176.     {                                       
  177.     volatile UINT32 temp ;                  
  178.     temp = (UINT32)(DMA_RX_SMASK_VAL);      
  179.     *((volatile UINT32 *)DMA_RX_STATUS_MASK(pDrvCtrl))|=temp;
  180.     temp=*((volatile UINT32 *)DMA_RX_STATUS_MASK(pDrvCtrl)) ;
  181.     }
  182.  
  183. #define DMA_RX_DPTR(pDrvCtrl)     
  184.                    IDT_DMA_REGS(pDrvCtrl,0x0c) /* DMA 2/4 descriptor ptr reg */
  185. #define DMA_RX_NDPTR(pDrvCtrl)    
  186.               IDT_DMA_REGS(pDrvCtrl,0x10) /* DMA 2/4 next descriptor ptr reg */
  187. #ifndef DMA_RX_DPTR_WR 
  188. #define DMA_RX_DPTR_WR(pDrvCtrl,val)                                         
  189.     {                                                                         
  190.     *((volatile UINT32 *)DMA_RX_DPTR(pDrvCtrl)) = K1_TO_PHYS((UINT32)(val)); 
  191.     }
  192. #endif
  193. #ifndef DMA_RX_DPTR_RD
  194. #define DMA_RX_DPTR_RD(pDrvCtrl)   
  195.              (PHYS_TO_K1(*((volatile UINT32 *)DMA_RX_DPTR(pDrvCtrl))))
  196. #endif /* DMA_RX_DPTR_RD */
  197. #ifndef DMA_RX_NDPTR_RD
  198. #define DMA_RX_NDPTR_RD(pDrvCtrl) 
  199.              (PHYS_TO_K1(*((volatile UINT32 *)DMA_RX_NDPTR(pDrvCtrl))))
  200. #endif /* DMA_RX_NDPTR_RD */
  201. #ifndef DMA_RX_NDPTR_WR
  202. #define DMA_RX_NDPTR_WR(pDrvCtrl,val)                                      
  203.     {                                                                       
  204.     *((volatile UINT32 *)DMA_RX_NDPTR(pDrvCtrl)) = K1_TO_PHYS((UINT32)(val));
  205.     }
  206. #endif /* DMA_RX_NDPTR_WR */
  207. /* Ethernet Transmit DMA defines : DMA Channel 10 */
  208. #define DMA_TX_CONTROL(pDrvCtrl)     
  209.         IDT_DMA_REGS(pDrvCtrl,0x14) /* DMA 3/5 control register */
  210. #define DMA_TX_CNT_MODE     0x00000008
  211. #define DMA_TX_CNT_RUN      0x00000001
  212. #define DMA_TX_CNT_VAL      0x00000009
  213. #define DMA_TX_CONTROL_RD(pDrvCtrl)    
  214.                        (*((volatile UINT32 *)DMA_TX_CONTROL(pDrvCtrl)))
  215. #define DMA_TX_CONTROL_WR(pDrvCtrl,val) 
  216.              (*((volatile UINT32 *)DMA_TX_CONTROL(pDrvCtrl)) = (val| 0x8))
  217. #define DMA_TX_STATUS(pDrvCtrl)     
  218.         IDT_DMA_REGS(pDrvCtrl,0x18) /* DMA 3/5 status register */
  219. #define DMA_TX_FINISHED     0x00000001
  220. #define DMA_TX_DONE         0x00000002
  221. #define DMA_TX_CHAIN        0x00000004
  222. #define DMA_TX_ERROR        0x00000008
  223. #define DMA_TX_HALT         0x00000010
  224. #define DMA_TX_STATUS_RD(pDrvCtrl)     
  225.         (*((volatile UINT32 *)DMA_TX_STATUS(pDrvCtrl)))
  226. #define DMA_TX_STATUS_WR(pDrvCtrl,val)  
  227.          (*((volatile UINT32 *)DMA_TX_STATUS(pDrvCtrl)) = (val))
  228. #define DMA_TX_STATUS_MASK(pDrvCtrl)  
  229.         IDT_DMA_REGS(pDrvCtrl,0x1c)/* DMA 3/5 status mask register */
  230. #define DMA_TX_SMASK_VAL   
  231.         (DMA_TX_ERROR | DMA_TX_FINISHED | DMA_TX_DONE | DMA_TX_HALT)
  232. #define DMA_TX_SMASK_RD(pDrvCtrl)   
  233.         (*((volatile UINT32 *)DMA_TX_STATUS_MASK(pDrvCtrl)))
  234. #define DMA_TX_SMASK_WR(pDrvCtrl,val) 
  235.         (*((volatile UINT32 *)DMA_TX_STATUS_MASK(pDrvCtrl)) = (val))
  236. /* enable and disable ethernet DMA TX interrupts */
  237.  
  238. #define ETH_DMA_TX_INT_ENABLE(pDrvCtrl)       
  239.     {                                       
  240.     volatile UINT32 temp ;                  
  241.     temp = (UINT32)(~( DMA_TX_SMASK_VAL) ); 
  242.     *((volatile UINT32 *)DMA_TX_STATUS_MASK(pDrvCtrl))&=temp;
  243.     temp= *((volatile UINT32 *)DMA_TX_STATUS_MASK(pDrvCtrl)) ;
  244.     }
  245. #define ETH_DMA_TX_INT_DISABLE(pDrvCtrl)       
  246.     {                                       
  247.     volatile UINT32 temp ;                  
  248.     temp = (UINT32)(DMA_TX_SMASK_VAL);      
  249.     *((volatile UINT32 *)DMA_TX_STATUS_MASK(pDrvCtrl))|=temp;
  250.     temp=*((volatile UINT32 *)DMA_TX_STATUS_MASK(pDrvCtrl)) ;
  251.     }
  252.     
  253. #define DMA_TX_DPTR(pDrvCtrl)  
  254.         IDT_DMA_REGS(pDrvCtrl,0x20) /* DMA 3/5 descriptor pointer reg */
  255. #ifndef DMA_TX_DPTR_RD
  256. #define DMA_TX_DPTR_RD(pDrvCtrl)  
  257.        (PHYS_TO_K1(*((volatile UINT32 *)DMA_TX_DPTR(pDrvCtrl))))
  258. #endif /* DMA_TX_DPTR_RD */
  259. /* DMA_TX_DPTR_WR starts the send of of TDR packet */
  260. #ifndef DMA_TX_DPTR_WR
  261. #define DMA_TX_DPTR_WR(pDrvCtrl,val)                                       
  262.     {                                                                       
  263.     *((volatile UINT32 *)DMA_TX_DPTR(pDrvCtrl)) = K1_TO_PHYS((UINT32)(val));
  264.     }
  265. #endif /* DMA_TX_DPTR_WR */
  266. #define DMA_TX_NDPTR(pDrvCtrl)  IDT_DMA_REGS(pDrvCtrl,0x24)  
  267.                                 /* DMA 3/5 next descriptor ptr reg */
  268. #ifndef DMA_TX_NDPTR_RD
  269. #define DMA_TX_NDPTR_RD(pDrvCtrl) 
  270.                  (PHYS_TO_K1(*((volatile UINT32 *)DMA_TX_NDPTR(pDrvCtrl))))
  271. #endif /* DMA_TX_NDPTR_RD */
  272. #ifndef DMA_TX_NDPTR_WR
  273. #define DMA_TX_NDPTR_WR(pDrvCtrl,val)                                     
  274.     {                                                                       
  275.     *((volatile UINT32 *)DMA_TX_NDPTR(pDrvCtrl)) = K1_TO_PHYS((UINT32)(val));
  276.     }
  277. #endif /* DMA_TX_NDPTR_WR */
  278. /* Ethernet Interface Control Register */
  279. #define IDT_ETHINTFC_REG(pDrvCtrl)     IDT_ETH_REGS(pDrvCtrl,0x00)
  280.     
  281. #define IDT_ETHINTFC_EN      0x00000001
  282. #define IDT_ETHINTFC_DIS     0x00000000
  283. #define IDT_ETHINTFC_RIP     0x00000004
  284. /* Ethernet Multicast Hash Registers */
  285. #define IDT_ETHHASH0_REG(pDrvCtrl)     IDT_ETH_REGS(pDrvCtrl,0x0c)
  286. #define IDT_ETHHASH1_REG(pDrvCtrl)     IDT_ETH_REGS(pDrvCtrl,0x10)
  287. /* Ethernet MAC Address Registers  */
  288. #define IDT_ETHSAL0_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x0100)
  289. #define IDT_ETHSAH0_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x0104)
  290. #define IDT_ETHSAL1_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x0108)
  291. #define IDT_ETHSAH1_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x010c)
  292. #define IDT_ETHSAL2_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x0110)
  293. #define IDT_ETHSAH2_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x0114)
  294. #define IDT_ETHSAL3_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x0118)
  295. #define IDT_ETHSAH3_REG(pDrvCtrl)  IDT_ETH_REGS(pDrvCtrl,0x011c)
  296. #define IDT_ETHSAL_WRITE(pDrvCtrl,value)                                   
  297.     {                                                                       
  298.     *((volatile UINT32 *)IDT_ETHSAL0_REG(pDrvCtrl)) = (value);             
  299.     *((volatile UINT32 *)IDT_ETHSAL1_REG(pDrvCtrl)) = (value);             
  300.     *((volatile UINT32 *)IDT_ETHSAL2_REG(pDrvCtrl)) = (value);             
  301.     *((volatile UINT32 *)IDT_ETHSAL3_REG(pDrvCtrl)) = (value);             
  302.     } 
  303. #define IDT_ETHSAH_WRITE(pDrvCtrl,value)                                   
  304.     {                                                                       
  305.     *((volatile UINT32 *)IDT_ETHSAH0_REG(pDrvCtrl)) = (value);             
  306.     *((volatile UINT32 *)IDT_ETHSAH1_REG(pDrvCtrl)) = (value);             
  307.     *((volatile UINT32 *)IDT_ETHSAH2_REG(pDrvCtrl)) = (value);             
  308.     *((volatile UINT32 *)IDT_ETHSAH3_REG(pDrvCtrl)) = (value);             
  309.     } 
  310.  
  311. #define ETH_DMA_OVRRUN(pDrvCtrl)       
  312.  if( ETH0.eth0intfc & ETHERINTFC_OVR )
  313.         {
  314.         ETH0.eth0intfc = ( ETH0.eth0intfc & (~(UINT32)(ETHERINTFC_OVR)) );
  315.                 } 
  316.     else if( ETH1.eth1intfc & ETHERINTFC_OVR )
  317.         {     
  318.         ETH1.eth1intfc = ( ETH1.eth1intfc & (~(UINT32)(ETHERINTFC_OVR)) );
  319.         }
  320.         
  321. /* Ethernet Address recognition control register */
  322. #define IDT_ETHARC_REG(pDrvCtrl)   IDT_ETH_REGS(pDrvCtrl,0x08)
  323. #define IDT_ETHARC_PRO   0x00000001
  324. #define IDT_ETHARC_AM    0x00000002    
  325. #define IDT_ETHARC_AFM   0x00000004
  326. #define IDT_ETHARC_AB    0x00000008  
  327. #define IDT_SET_PROMISC(pDrvCtrl)                                          
  328.     {                                                                       
  329.     *((volatile UINT32 *)IDT_ETHARC_REG(pDrvCtrl)) |= IDT_ETHARC_PRO;      
  330.     }
  331. #define IDT_CLR_PROMISC(pDrvCtrl)                                          
  332.     {                                                                       
  333.     *((volatile UINT32 *)IDT_ETHARC_REG(pDrvCtrl)) &= ~IDT_ETHARC_PRO;     
  334.     }
  335. #define IDT_SET_MCAST(pDrvCtrl)                                            
  336.     {                                                                       
  337.     *((volatile UINT32 *)IDT_ETHARC_REG(pDrvCtrl)) |= IDT_ETHARC_AM;       
  338.     }
  339. #define IDT_SET_MCASTALL(pDrvCtrl)                                         
  340.     {                                                                       
  341.     *((volatile UINT32 *)IDT_ETHARC_REG(pDrvCtrl)) |= IDT_ETHARC_AFM;      
  342.     }
  343. #define IDT_ETHFIFOTT_REG(pDrvCtrl)    IDT_ETH_REGS(pDrvCtrl,0x04)
  344. #define IDT_ETHFIFOTT_VAL     0x40        /* Assuming COLWIN to be 0x37 */
  345.  
  346.  
  347. /* Ethernet MAC Controller Registers and bit definitions */
  348. #define IDT_ETHMAC1_REG(pDrvCtrl)      IDT_ETH_REGS(pDrvCtrl,0x0200)
  349. #define IDT_ETHMAC1_RE       0x1
  350. #define IDT_ETHMAC1_PAF      0x2
  351. #define IDT_ETHMAC1_RFC      0x4
  352. #define IDT_ETHMAC1_TFC      0x8
  353. #define IDT_ETHMAC1_LB       0x10
  354. #define IDT_ETHMAC1_MR       0x8000
  355. #define IDT_ETHMAC2_REG(pDrvCtrl)      IDT_ETH_REGS(pDrvCtrl,0x0204)
  356. #define IDT_ETHMAC2_FD       0x1
  357. #define IDT_ETHMAC2_FLC      0x2
  358. #define IDT_ETHMAC2_HFE      0x4
  359. #define IDT_ETHMAC2_DC       0x8
  360. #define IDT_ETHMAC2_CEN      0x10
  361. #define IDT_ETHMAC2_PE       0x20
  362. #define IDT_ETHMAC2_VPE      0x40
  363. #define IDT_ETHMAC2_APE      0x80
  364. #define IDT_ETHMAC2_PPE      0x100
  365. #define IDT_ETHMAC2_LPE      0x200
  366. #define IDT_ETHMAC2_NB       0x1000
  367. #define IDT_ETHMAC2_BP       0x2000
  368. #define IDT_ETHMAC2_ED       0x4000
  369. #define IDT_ETHIPGT_REG(pDrvCtrl)      IDT_ETH_REGS(pDrvCtrl,0x0208)
  370. #define IDT_ETHIPGT_HDX      0x12
  371. #define IDT_ETHIPGT_FDX      0x15    
  372. #define IDT_ETHIPGR_REG(pDrvCtrl)      IDT_ETH_REGS(pDrvCtrl,0x020c)
  373. #define IDT_ETHIPGR_HDX      0x1212
  374. #define IDT_ETHIPGR_FDX      0x1515  
  375. #define IDT_ETHCLRT_REG(pDrvCtrl)      IDT_ETH_REGS(pDrvCtrl,0x0210)
  376. #define IDT_ETHCLRT_VAL      0x370F
  377. #define IDT_ETHMAXF_REG(pDrvCtrl)      IDT_ETH_REGS(pDrvCtrl,0x0214)
  378. #define IDT_ETHMAXF_VAL      0x0600
  379.  
  380. /* MII Management Interface Registers and bit values */
  381. #define IDT_ETH_REG_BASE     0xB8058000
  382. #define IDT_MIIMCFG_REG      IDT_ETH_REG_BASE + 0x0220
  383. #define IDT_MIIMCMD_REG      IDT_ETH_REG_BASE + 0x0224
  384. #define IDT_MIIMADDR_REG     IDT_ETH_REG_BASE + 0x0228
  385. #define IDT_MIIMWTD_REG      IDT_ETH_REG_BASE + 0x022c
  386. #define IDT_MIIMRDD_REG      IDT_ETH_REG_BASE + 0x0230
  387. #define IDT_MIIMIND_REG      IDT_ETH_REG_BASE + 0x0234
  388. #define IDT_ETHMCP_REG       IDT_ETH_REG_BASE + 0x0028
  389. #define IDT_ETHMCP_VAL      0
  390. #define MIICFG_RESET_VAL     0x00008000
  391.  
  392. #define MIICMD_SET_SCAN()                                                   
  393.     {                                                                       
  394.     *((volatile UINT32 *)IDT_MIIMCMD_REG) = MIIMCMD_SCN;                    
  395.     }
  396. #define MIICMD_RESET_SCAN()                                                 
  397.     {                                                                       
  398.     *((volatile UINT32 *)IDT_MIIMCMD_REG) &= ~MIIMCMD_SCN;                  
  399.     }
  400. #define MIIM_RESET()                                                        
  401.     {                                                                       
  402.     *((volatile UINT32 *)IDT_MIIMCMD_REG) = MIICFG_RESET_VAL;               
  403.     }
  404. /* PHY Device used on the board : LXT972 
  405.  * Register Definitions 
  406.  */
  407. #define PHY_ADDR_0              0x0
  408. #define PHY_ADDR_1              0x1
  409. #define PHY_10MBS               0
  410. #define PHY_100MBS              1
  411. #define PHY_AUTO_SPEED          2
  412. #define PHY_HALF_DPX            0
  413. #define PHY_FULL_DPX            1
  414. #define PHY_AUTO_DPX            2
  415. #define PHY_CONTROL_REG         0x0
  416. #define PHY_RESET_VAL           0x8000
  417. #define PHY_LOOP_EN             0x4000
  418. #define PHY_SPEED_SEL           0x2000
  419. #define PHY_AUTONEG_EN          0x1000
  420. #define PHY_PWR_DOWN            0x0800
  421. #define PHY_ISOLATE             0x0400
  422. #define PHY_RESTART_AN          0x0200
  423. #define PHY_DPLX_MODE           0x0100
  424. #define PHY_COL_TEST            0x0080
  425. #define PHY_SPD_SELECT          0x0040
  426. #define PHY_NEGOTIATE           (PHY_AUTONEG_EN | PHY_RESTART_AN)
  427. #define PHY_STATUS1_REG         0x1
  428. #define PHY_10BASE_T4           0x8000
  429. #define PHY_100BASEX_FULL       0x4000
  430. #define PHY_100BASEX_HALF       0x2000
  431. #define PHY_10BASE_FULL         0x1000
  432. #define PHY_10BASE_HALF         0x0800
  433. #define PHY_10BASET2_HALF       0x0400
  434. #define PHY_10BASET2_FULL       0x0200
  435. #define PHY_EXT_STATUS          0x0100
  436. #define PHY_MF_PREAM_SUPPRESS   0x0040
  437. #define PHY_AUTONEG_DONE        0x0020
  438. #define PHY_REMOTE_FAULT        0x0010
  439. #define PHY_AUTONEG_ABLE        0x0008
  440. #define PHY_LINK_STATUS         0x0004
  441. #define PHY_JABBER_DETECT       0x0002
  442. #define PHY_EXTEND_ABLE         0x0001
  443. #define PHY_PHY_ID_1_REG        0x2
  444. #define PHY_PHY_ID_2_REG        0x3
  445. #define PHY_AUTONEG_ADV_REG     0x4
  446. #define PHY_MULTIPAGE_ABLE      0x8000
  447. #define PHY_ASYM_PAUSE          0x0800
  448. #define PHY_PAUSE_EN            0x0400
  449. #define PHY_100BASETX_FULL      0x0100 
  450. #define PHY_100BASETX_ABLE      0x0080
  451. #define PHY_10BASET_FULL        0x0040
  452. #define PHY_10BASET_ABLE        0x0020
  453. #define PHY_IEEE802_3_VAL       0x0001
  454. #define PHY_AUTO_NEG_DEFAULT        
  455.             (                       
  456.             PHY_100BASETX_FULL |    
  457.             PHY_100BASETX_ABLE |    
  458.             PHY_10BASET_FULL   |    
  459.             PHY_10BASET_ABLE   |    
  460.             PHY_IEEE802_3_VAL       
  461.             ) 
  462. #define PHY_AUTONEG_LNK_ABILITY_REG  0x5
  463. #define PHY_AUTONEG_EXPANSION_REG    0x6
  464. #define PHY_BASE_PAGE             0x0020 
  465. #define PHY_PAR_DETECT_FAULT      0x0010
  466. #define PHY_LNK_PARTNER           0x0008
  467. #define PHY_NXT_PAG_ABLE          0x0004
  468. #define PHY_PAGE_RCVD             0x0002
  469. #define PHY_LNK_PARTNER_ANABLE    0x0001
  470. #define PHY_AUTONEG_LNK_PAGE_XMT_REG 0x7
  471. #define PHY_AUTONEG_LNK_NXT_PAGE_REG 0x8
  472. #define PHY_NEXT_PAGE         0x8000
  473. #define PHY_MESSAGE_PAGE      0x2000
  474. #define PHY_ACK2              0x1000
  475. #define PHY_TOGGLE            0x0800 
  476. #define PHY_PORT_CONFIG_REG   0x10
  477. #define PHY_FORCE_LNK_PASS    0x4000
  478. #define PHY_XMT_DISABLE       0x2000
  479. #define PHY_BYPASS_SCRAMBLER  0x1000
  480. #define PHY_JABBER            0x0400 
  481. #define PHY_SQE               0x0200
  482. #define PHY_TP_LOOPBACK       0x0100
  483. #define PHY_CRS_SELECT        0x0080
  484. #define PHY_PRE_EN            0x0020
  485. #define PHY_ALT_NXT_PAGE      0x0002
  486. #define PHY_STATUS2_REG       0x11
  487. #define PHY_STAT2_100         0x4000
  488. #define PHY_STAT2_LINK        0x0400
  489. #define PHY_STAT2_FULL_DPLX   0x0200
  490. #define PHY_STAT2_AN_ABLE     0x0100
  491. #define PHY_STAT2_AN_CMPLT    0x0080
  492. #define PHY_INTRPT_ENABLE_REG 0x12
  493. #define PHY_INTRPT_STATUS_REG 0x13
  494. #define PHY_LED_CONFIG_REG    0x14
  495. #define PHY_LED_VAL           0x1232
  496. #define PHY_LED_VAL2          0x1242
  497. #define PHY_XMT_CONTROL_REG   0x1E
  498. #define PHY_SPEED_10          10000000
  499. #define PHY_SPEED_100         100000000
  500. #undef DRV_DEBUG        
  501. #define DRV_DEBUG
  502. #ifdef  DRV_DEBUG
  503. /* define the various levels of debugging if the DRV_DEBUG is defined */    
  504. #define DRV_DEBUG_OFF         0x00000000
  505. #define DRV_DEBUG_RX          0x00000001
  506. #define DRV_DEBUG_TX          0x00000002
  507. #define DRV_DEBUG_INT         0x00000004
  508. #define DRV_DEBUG_POLL_RX     0x00000008
  509. #define DRV_DEBUG_POLL_TX     0x00000010
  510. #define DRV_DEBUG_POLL        (DRV_DEBUG_POLL_RX | DRV_DEBUG_POLL_TX)
  511. #define DRV_DEBUG_LOAD        0x00000020
  512. #define DRV_DEBUG_LOAD2       0x00000040
  513. #define DRV_DEBUG_IOCTL       0x00000080
  514. #define DRV_DEBUG_RESET       0x00000100
  515. #define DRV_DEBUG_MCAST       0x00000200
  516. #define DRV_DEBUG_CSR         0x00000400
  517. #define DRV_DEBUG_RX_PKT      0x00000800
  518. #define DRV_DEBUG_TX_PKT      0x00001000
  519. #define DRV_DEBUG_MEM         0x00002000
  520. #define DRV_DEBUG_POLL_REDIR  0x00004000
  521. #define DRV_DEBUG_LOG_NVRAM   0x00008000
  522. #define DRV_DEBUG_ENTRY       0x00010000
  523. #define DRV_DEBUG_INFO        0x00100000
  524. #define DRV_DEBUG_WARNING     0x00200000
  525. #define DRV_DEBUG_ERROR       0x00400000
  526. #define DRV_DEBUG_FATAL       0x00800000
  527. #define DRV_DEBUG_PANIC       0x01000000
  528. #define DRV_DEBUG_ALL         0xffffffff
  529. #define DRV_DEBUG_OVR         0x04000000
  530. #define DRV_LOG(FLG, X0, X1, X2, X3, X4, X5, X6)    
  531.         if (idt32438DebugFlags & FLG)               
  532.            (void)logMsg(X0, X1, X2, X3, X4, X5, X6);
  533. #else /*DRV_DEBUG*/
  534. #define DRV_LOG(DBG_SW, X0, X1, X2, X3, X4, X5, X6)
  535. #endif /*DRV_DEBUG*/
  536. /* minimum number of transmit and receive descriptors */
  537. #define MIN_NUM_TDRS    0x500     /* Number of TX descriptors */
  538. #define MIN_NUM_RDRS    0x500     /* Number of RX descriptors */
  539.  
  540. /* 
  541.  * The Ethernet DMA Descriptor Register data structure.
  542.  * This structure is used for both Transmit DMA Descriptor 
  543.  * Registers (TDR), and Receive DMA Descriptor Registers (RDR).
  544.  */
  545. typedef struct dma_dr
  546.     {
  547.     UINT32          control;            /* DMA control and status */
  548.     UINT32          ca;                 /* DMA buffer current address */
  549.     UINT32          devcs;              /* device control and status */
  550.     UINT32          link;               /* address of the next DMA descriptor */
  551.     volatile struct dma_dr * next;      /* points to next RDR/TDR */
  552.     volatile struct dma_dr * prev;      /* points to previous RDR/TDR */
  553.     char *          pClust;             /* points to cluster buffer */
  554.     M_BLK *         pMblk;              /* M_BLK to be freed */
  555.     UINT32          flags;              /* flags */
  556.     UINT32          pad[7];
  557.     } DMA_DR;
  558. /* DMA Descriptor Register control field bit definitions */
  559. #define DMA_DR_CONTROL_F        0x80000000  /* Finished */
  560. #define DMA_DR_CONTROL_D        0x40000000  /* Done */
  561. #define DMA_DR_CONTROL_T        0x20000000  /* Terminated */
  562. #define DMA_DR_CONTROL_IOD      0x10000000  /* Interrupt On Done */
  563. #define DMA_DR_CONTROL_IOF      0x08000000  /* Interrupt On Finished */
  564. #define DMA_DR_CONTROL_COF      0x02000000  /* chain on finished         */
  565. #define DMA_DR_CONTROL_COUNT    0x3FFFF     /* byte count */
  566. /* value loaded into receive DMA buffer descriptor control word */
  567. #define RX_DMA_COUNT    0x600
  568. #define RDR_CONTROL_VAL 
  569.             (DMA_DR_CONTROL_IOD | DMA_DR_CONTROL_IOF | RX_DMA_COUNT  )
  570. /*
  571.  * Ethernet Receive Descriptor Device Control and Status field bit definitions.
  572.  */
  573. #define RDR_DEVCS_FD    0x00000001  /* first descriptor */
  574. #define RDR_DEVCS_LD    0x00000002  /* last descriptor */
  575. #define RDR_DEVCS_ROK   0x00000004  /* receive OK */
  576. #define RDR_DEVCS_FM    0x00000008  /* filter match */
  577. #define RDR_DEVCS_MP    0x00000010  /* multicast packet */
  578. #define RDR_DEVCS_BP    0x00000020  /* broadcast packet */
  579. #define RDR_DEVCS_VLT   0x00000040  /* VLAN tag detected */
  580. #define RDR_DEVCS_CF    0x00000080  /* control frame */
  581. #define RDR_DEVCS_OVR   0x00000100  /* receive FIFO overflow */
  582. #define RDR_DEVCS_CRC   0x00000200  /* CRC error */
  583. #define RDR_DEVCS_CV    0x00000400  /* code violation */
  584. #define RDR_DEVCS_DB    0x00000800  /* dribble bits detected */
  585. #define RDR_DEVCS_LE    0x00001000  /* length error */
  586. #define RDR_DEVCS_LOR   0x00002000  /* length out of range */
  587. #define RDR_DEVCS_CES   0x00004000  /* carrier event seen */
  588. /*
  589.  * Ethernet Transmit Descriptor Device Control and Status field bit definitions.
  590.  */
  591. #define TDR_DEVCS_FD    0x00000001  /* first descriptor */
  592. #define TDR_DEVCS_LD    0x00000002  /* last descriptor */
  593. #define TDR_DEVCS_OEN   0x00000004  /* override enable */
  594. #define TDR_DEVCS_PEN   0x00000008  /* packet padding enable */
  595. #define TDR_DEVCS_CEN   0x00000010  /* packet CRC enable */
  596. #define TDR_DEVCS_HEN   0x00000020  /* huge packet enable */
  597. #define TDR_DEVCS_TOK   0x00000040  /* transmit OK */
  598. #define TDR_DEVCS_MP    0x00000080  /* multicast packet */
  599. #define TDR_DEVCS_BP    0x00000100  /* broadcast packet */
  600. #define TDR_DEVCS_UND   0x00000200  /* transmit FIFO underflow */
  601. #define TDR_DEVCS_OF    0x00000400  /* oversized frame */
  602. #define TDR_DEVCS_ED    0x00000800  /* excessive deferral */
  603. #define TDR_DEVCS_EC    0x00001000  /* excessive collisions */
  604. #define TDR_DEVCS_LC    0x00002000  /* late collision */
  605. #define TDR_DEVCS_TD    0x00004000  /* transmit deferred */
  606. #define TDR_DEVCS_CRC   0x00008000  /* CRC error */
  607. #define TDR_DEVCS_LE    0x00010000  /* length error */
  608. /* TDR/RDR Flags : Bit Definition */
  609. #define TDR_IN_USE      0x01
  610. #define TDR_LAST        0x02
  611. #define TDR_FIRST       0x04
  612. /* physical interface specific infomation */
  613. typedef struct phy_info
  614.     {
  615.     int     phyAddr;                /* PHY device address: 0-32 */
  616.     int     phySpeed;               /* PHY speed: PHY_10MBS PHY_100MBS */
  617.     int     phyDpx;                 /* PHY duplex: PHY_HALF_DPX PHY_FULL_DPX */
  618.     char    enetAddr[ENET_SIZE];    /* ethernet address */
  619.     } PHY_INFO;
  620. typedef struct drv_ctrl
  621.     {
  622.     END_OBJ     endObj;              /* base class */
  623.     END_ERR     lastError;           /* Last error passed to muxError */
  624.     int         unit;                /* unit number */
  625.     char *      pMemArea;            /* cluster block pointer */
  626.     int         nTDRs;               /* how many TDRs to create */
  627.     char *      pTDRmem;             /* TX Descriptor Register memory base */
  628.     volatile DMA_DR *    pTDRHead;   /* next tx descriptor to complete TX */
  629.     volatile DMA_DR *    pTDRTail;   /* next transmit descriptor to sent */
  630.     volatile DMA_DR *    pTDRQStart; /* start of queue of transmit descriptor */
  631.     int         cntTDRused;          /* count of TDRs in use */
  632.     int         nRDRs;               /* how many RDRs to create */
  633.     char *      pRDRmem;             /* RX Descriptor Register memory base */
  634.     volatile DMA_DR *    pRDR;       /* receive descriptor pointer */
  635.     volatile UINT32      flags;      /* driver state */
  636.     BOOL        attached;            /* interface has been attached */
  637.     BOOL        txBlocked;           /* TX send blocked.  No TDRs available. */
  638.     PHY_INFO    board;               /* physical interface info */
  639.     CL_POOL_ID  pClPoolId;           /* cluster pool identifier */
  640.     char *      clBaseAddr;          /* cluster buffer pool base addr */
  641.     UINT32      dmaRegBase;          /* base address of DMA registers */
  642.     UINT32      ethRegBase;          /* base address of ethernet registers */
  643.     UINT32      intRegBase;          /* base addr of interrupt ctrl registers */
  644.     int         ivec;                /* input overflow vector number */
  645.     } DRV_CTRL;
  646. /* DRV_CTRL flags element bit definitions */
  647.  
  648. #define IDT_POLLING     0x00000001   /* polling mode                  */
  649. #define IDT_PROMISC     0x00000002   /* promiscuous mode              */
  650. #define IDT_MCAST       0x00000004   /* multicast addressing mode     */
  651. #define IDT_MCASTALL    0x00000008   /* all multicast addressing mode */
  652. #define IDT_RX_NETADD   0x00000010   /* Rx netAdd() requested */
  653. #define IDT_TX_NETADD   0x00000020   /* Tx netAdd() requested */
  654. #define IDT_ETHER_RESET 0x00000040   /* Ethernet reset */
  655. /* Ethernet Transmit Descriptors Read Macros */
  656. #ifdef INCLUDE_RFC_1213
  657. #define IDT_HADDR(pEnd)      ((pEnd)->mib2Tbl.ifPhysAddress.phyAddress)
  658. #define IDT_HADDR_LEN(pEnd)  ((pEnd)->mib2Tbl.ifPhysAddress.addrLength)
  659. #else
  660. #define IDT_HADDR(pEnd)                                                 
  661.                 ((pEnd)->pMib2Tbl->m2Data.mibIfTbl.ifPhysAddress.phyAddress)
  662. #define IDT_HADDR_LEN(pEnd)                                             
  663.                 ((pEnd)->pMib2Tbl->m2Data.mibIfTbl.ifPhysAddress.addrLength)
  664. #endif
  665. /*
  666.  * Buffer Management Macros 
  667.  */
  668. #define NET_BUF_ALLOC()                                                 
  669.     netClusterGet (pDrvCtrl->endObj.pNetPool, pDrvCtrl->clPoolId)
  670. #define NET_BUF_FREE(pBuf)                                              
  671.     netClFree (pDrvCtrl->endObj.pNetPool, pBuf)
  672. #define NET_MBLK_ALLOC()                                                
  673.     mBlkGet (pDrvCtrl->endObj.pNetPool, M_DONTWAIT, MT_DATA)
  674. #define NET_MBLK_FREE(pMblk)                                            
  675.     netMblkFree (pDrvCtrl->endObj.pNetPool, (M_BLK_ID)pMblk)
  676. #define NET_CL_BLK_ALLOC()                                              
  677.     clBlkGet (pDrvCtrl->endObj.pNetPool, M_DONTWAIT)
  678. #define NET_CL_BLK_FREE(pClblk)                                         
  679.     clBlkFree (pDrvCtrl->endObj.pNetPool, (CL_BLK_ID)pClBlk)
  680.             
  681. #define NET_MBLK_BUF_FREE(pMblk)                                        
  682.     netMblkClFree ((M_BLK_ID)pMblk)
  683. #define NET_MBLK_CHAIN_FREE(pMblk)                                      
  684.     {                                                                   
  685.     M_BLK *pNext;                                                       
  686.                                                                         
  687.     pNext=pMblk;                                                        
  688.     while (pNext)                                                       
  689.         pNext=NET_MBLK_BUF_FREE (pNext);                                
  690.     }
  691.     
  692. #define NET_MBLK_CL_JOIN(pMblk, pClBlk)                              
  693.     netMblkClJoin ((pMblk), (pClBlk))
  694. #define NET_CL_BLK_JOIN(pClBlk, pBuf, len)                             
  695.     netClBlkJoin ((pClBlk), (pBuf), (len), NULL, 0, 0, 0)
  696.         
  697.  
  698. #ifdef __cplusplus
  699. }
  700. #endif
  701. #endif /* __INCidt32438Endh */