1*3afdc120SJia-Ju Bai #ifndef _NDR_H 2*3afdc120SJia-Ju Bai #define _NDR_H 38d98f2e5SJia-Ju Bai 48d98f2e5SJia-Ju Bai /* ======= General Parameter ======= */ 58d98f2e5SJia-Ju Bai /* Global configure */ 68d98f2e5SJia-Ju Bai 7*3afdc120SJia-Ju Bai #include <minix/drivers.h> 88d98f2e5SJia-Ju Bai 9*3afdc120SJia-Ju Bai #define DRIVER_NAME "IP1000" 108d98f2e5SJia-Ju Bai 11*3afdc120SJia-Ju Bai /* Rx/Tx buffer parameter */ 12*3afdc120SJia-Ju Bai #define RX_BUF_SIZE 1536 13*3afdc120SJia-Ju Bai #define TX_BUF_SIZE 1536 14*3afdc120SJia-Ju Bai #define RX_BUFFER_NUM 64 15*3afdc120SJia-Ju Bai #define TX_BUFFER_NUM 64 168d98f2e5SJia-Ju Bai 17*3afdc120SJia-Ju Bai /* Interrupt status */ 18*3afdc120SJia-Ju Bai #define INTR_STS_LINK 0x0100 19*3afdc120SJia-Ju Bai #define INTR_STS_RX 0x0400 20*3afdc120SJia-Ju Bai #define INTR_STS_TX 0x0200 218d98f2e5SJia-Ju Bai 228d98f2e5SJia-Ju Bai /* Link status */ 238d98f2e5SJia-Ju Bai #define LINK_UP 1 248d98f2e5SJia-Ju Bai #define LINK_DOWN 0 258d98f2e5SJia-Ju Bai #define LINK_UNKNOWN -1 268d98f2e5SJia-Ju Bai 27*3afdc120SJia-Ju Bai /* Interrupt control */ 28*3afdc120SJia-Ju Bai #define INTR_ENABLE 1 29*3afdc120SJia-Ju Bai #define INTR_DISABLE 0 30*3afdc120SJia-Ju Bai 31*3afdc120SJia-Ju Bai /* Rx status */ 32*3afdc120SJia-Ju Bai #define RX_ERROR 1 33*3afdc120SJia-Ju Bai #define RX_OK 0 34*3afdc120SJia-Ju Bai #define RX_SUSPEND -1 35*3afdc120SJia-Ju Bai 36*3afdc120SJia-Ju Bai /* Tx status */ 37*3afdc120SJia-Ju Bai #define TX_ERROR 1 38*3afdc120SJia-Ju Bai #define TX_OK 0 39*3afdc120SJia-Ju Bai #define TX_SUSPEND -1 40*3afdc120SJia-Ju Bai 41*3afdc120SJia-Ju Bai /* Rx/Tx control */ 42*3afdc120SJia-Ju Bai #define RX_TX_ENABLE 1 43*3afdc120SJia-Ju Bai #define RX_TX_DISABLE 0 448d98f2e5SJia-Ju Bai 458d98f2e5SJia-Ju Bai /* ======= Self-defined Parameter ======= */ 468d98f2e5SJia-Ju Bai #define RFI_FRAG_LEN 0xffff000000000000ULL 478d98f2e5SJia-Ju Bai #define RFS_FRAME_LEN 0x000000000000ffffULL 488d98f2e5SJia-Ju Bai #define RFS_FRAME_START 0x0000000020000000ULL 498d98f2e5SJia-Ju Bai #define RFS_FRAME_END 0x0000000040000000ULL 508d98f2e5SJia-Ju Bai #define RFS_RFD_DONE 0x0000000080000000ULL 51*3afdc120SJia-Ju Bai #define RFS_ERROR 0x00000000003f0000ULL 528d98f2e5SJia-Ju Bai #define RFS_NORMAL (RFS_RFD_DONE | RFS_FRAME_START | RFS_FRAME_END) 538d98f2e5SJia-Ju Bai 548d98f2e5SJia-Ju Bai #define TFI_FRAG_LEN 0xffff000000000000ULL 558d98f2e5SJia-Ju Bai #define TFS_FRAMEID 0x000000000000ffffULL 568d98f2e5SJia-Ju Bai #define TFS_WORD_ALIGN 0x0000000000030000ULL 578d98f2e5SJia-Ju Bai #define TFS_TX_DMA_INDICATE 0x0000000000800000ULL 588d98f2e5SJia-Ju Bai #define TFS_FRAG_COUNT 0x000000000f000000ULL 598d98f2e5SJia-Ju Bai #define TFS_TFD_DONE 0x0000000080000000ULL 608d98f2e5SJia-Ju Bai 618d98f2e5SJia-Ju Bai #define REG_DMA_CTRL 0x00 62*3afdc120SJia-Ju Bai #define REG_TX_DESC_BASEL 0x10 63*3afdc120SJia-Ju Bai #define REG_TX_DESC_BASEU 0x14 648d98f2e5SJia-Ju Bai #define REG_TX_DMA_BTH 0x18 658d98f2e5SJia-Ju Bai #define REG_TX_DMA_UTH 0x19 668d98f2e5SJia-Ju Bai #define REG_TX_DMA_PERIOD 0x1a 67*3afdc120SJia-Ju Bai #define REG_RX_DESC_BASEL 0x1c 68*3afdc120SJia-Ju Bai #define REG_RX_DESC_BASEU 0x20 698d98f2e5SJia-Ju Bai #define REG_RX_DMA_BTH 0x24 708d98f2e5SJia-Ju Bai #define REG_RX_DMA_UTH 0x25 718d98f2e5SJia-Ju Bai #define REG_RX_DMA_PERIOD 0x26 728d98f2e5SJia-Ju Bai #define REG_ASIC_CTRL 0x30 738d98f2e5SJia-Ju Bai #define REG_FLOW_OFF_TH 0x3c 748d98f2e5SJia-Ju Bai #define REG_FLOW_ON_TH 0x3e 758d98f2e5SJia-Ju Bai #define REG_EEPROM_DATA 0x48 768d98f2e5SJia-Ju Bai #define REG_EEPROM_CTRL 0x4a 77*3afdc120SJia-Ju Bai #define REG_ISR 0x5a 78*3afdc120SJia-Ju Bai #define REG_IMR 0x5c 798d98f2e5SJia-Ju Bai #define REG_MAC_CTRL 0x6c 808d98f2e5SJia-Ju Bai #define REG_PHY_SET 0x75 818d98f2e5SJia-Ju Bai #define REG_PHY_CTRL 0x76 828d98f2e5SJia-Ju Bai #define REG_STA_ADDR0 0x78 838d98f2e5SJia-Ju Bai #define REG_STA_ADDR1 0x7a 848d98f2e5SJia-Ju Bai #define REG_STA_ADDR2 0x7c 858d98f2e5SJia-Ju Bai #define REG_MAX_FRAME 0x86 86*3afdc120SJia-Ju Bai #define REG_RCR 0x88 878d98f2e5SJia-Ju Bai 888d98f2e5SJia-Ju Bai #define AC_LED_MODE 0x00004000 898d98f2e5SJia-Ju Bai #define AC_GB_RESET 0x00010000 908d98f2e5SJia-Ju Bai #define AC_RX_RESET 0x00020000 918d98f2e5SJia-Ju Bai #define AC_TX_RESET 0x00040000 928d98f2e5SJia-Ju Bai #define AC_DMA 0x00080000 938d98f2e5SJia-Ju Bai #define AC_FIFO 0x00100000 948d98f2e5SJia-Ju Bai #define AC_NETWORK 0x00200000 958d98f2e5SJia-Ju Bai #define AC_HOST 0x00400000 968d98f2e5SJia-Ju Bai #define AC_AUTO_INIT 0x00800000 978d98f2e5SJia-Ju Bai #define AC_RESET_BUSY 0x04000000 988d98f2e5SJia-Ju Bai #define AC_LED_SPEED 0x08000000 998d98f2e5SJia-Ju Bai #define AC_LED_MODE_B1 0x20000000 1008d98f2e5SJia-Ju Bai #define AC_RESET_ALL (AC_GB_RESET | AC_RX_RESET | AC_TX_RESET | AC_DMA | \ 1018d98f2e5SJia-Ju Bai AC_FIFO | AC_NETWORK | AC_HOST | AC_AUTO_INIT) 1028d98f2e5SJia-Ju Bai 1038d98f2e5SJia-Ju Bai #define MC_DUPLEX_SEL 0x00000020 1048d98f2e5SJia-Ju Bai #define MC_TX_FC_ENA 0x00000080 1058d98f2e5SJia-Ju Bai #define MC_RX_FC_ENA 0x00000100 1068d98f2e5SJia-Ju Bai #define MC_STAT_DISABLE 0x00400000 1078d98f2e5SJia-Ju Bai #define MC_TX_ENABLE 0x01000000 1088d98f2e5SJia-Ju Bai #define MC_TX_DISABLE 0x02000000 1098d98f2e5SJia-Ju Bai #define MC_RX_ENABLE 0x08000000 1108d98f2e5SJia-Ju Bai #define MC_RX_DISABLE 0x10000000 1118d98f2e5SJia-Ju Bai #define MC_PAUSED 0x40000000 1128d98f2e5SJia-Ju Bai 1138d98f2e5SJia-Ju Bai #define PC_DUPLEX_STS 0x10 1148d98f2e5SJia-Ju Bai #define PC_LINK_SPEED 0xc0 1158d98f2e5SJia-Ju Bai #define PC_LINK_SPEED10 0x40 1168d98f2e5SJia-Ju Bai #define PC_LINK_SPEED100 0x80 1178d98f2e5SJia-Ju Bai #define PC_LINK_SPEED1000 0xc0 1188d98f2e5SJia-Ju Bai 119*3afdc120SJia-Ju Bai #define CMD_INTR_ENABLE 0x17e6 120*3afdc120SJia-Ju Bai #define CMD_RCR_UNICAST 0x01 121*3afdc120SJia-Ju Bai #define CMD_RCR_MULTICAST 0x02 122*3afdc120SJia-Ju Bai #define CMD_RCR_BROADCAST 0x04 123*3afdc120SJia-Ju Bai #define CMD_TX_START 0x1000 124*3afdc120SJia-Ju Bai 1258d98f2e5SJia-Ju Bai #define EC_READ 0x0200 1268d98f2e5SJia-Ju Bai #define EC_BUSY 0x8000 1278d98f2e5SJia-Ju Bai 1288d98f2e5SJia-Ju Bai static u16_t PhyParam[] = { 1298d98f2e5SJia-Ju Bai (0x4000|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000, 1308d98f2e5SJia-Ju Bai 30, 0x005e, 9, 0x0700, 1318d98f2e5SJia-Ju Bai (0x4100|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000, 1328d98f2e5SJia-Ju Bai 30, 0x005e, 9, 0x0700, 1338d98f2e5SJia-Ju Bai (0x4200|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000, 1348d98f2e5SJia-Ju Bai 30, 0x005e, 9, 0x0700, 1358d98f2e5SJia-Ju Bai (0x4300|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000, 1368d98f2e5SJia-Ju Bai 30, 0x005e, 9, 0x0700, 0x0000 1378d98f2e5SJia-Ju Bai }; 1388d98f2e5SJia-Ju Bai 1398d98f2e5SJia-Ju Bai /* ======= Data Descriptor ======= */ 140*3afdc120SJia-Ju Bai typedef struct NDR_desc { 141*3afdc120SJia-Ju Bai u64_t next; 142*3afdc120SJia-Ju Bai u64_t status; 143*3afdc120SJia-Ju Bai u64_t frag_info; 144*3afdc120SJia-Ju Bai } NDR_desc; 1458d98f2e5SJia-Ju Bai 1468d98f2e5SJia-Ju Bai /* Driver Data Structure */ 147*3afdc120SJia-Ju Bai typedef struct NDR_driver { 148*3afdc120SJia-Ju Bai char *dev_name; /* Device name */ 149*3afdc120SJia-Ju Bai u16_t vid, did; /* Vendor and device ID */ 150*3afdc120SJia-Ju Bai u32_t devind; /* Device index */ 151*3afdc120SJia-Ju Bai u32_t base[6]; /* Base address */ 152*3afdc120SJia-Ju Bai char irq; /* IRQ number */ 153*3afdc120SJia-Ju Bai char revision; /* Revision ID */ 154*3afdc120SJia-Ju Bai 1558d98f2e5SJia-Ju Bai int mode; 1568d98f2e5SJia-Ju Bai int link; /* Whether link-up */ 1578d98f2e5SJia-Ju Bai int recv_flag; /* Receive flag */ 1588d98f2e5SJia-Ju Bai int send_flag; /* Send flag */ 159*3afdc120SJia-Ju Bai int tx_busy; /* Whether Tx is busy */ 1608d98f2e5SJia-Ju Bai 1618d98f2e5SJia-Ju Bai /* Buffer */ 1628d98f2e5SJia-Ju Bai size_t buf_size; 1638d98f2e5SJia-Ju Bai char *buf; 1648d98f2e5SJia-Ju Bai 1658d98f2e5SJia-Ju Bai /* Rx data */ 1668d98f2e5SJia-Ju Bai int rx_head; 1678d98f2e5SJia-Ju Bai struct { 1688d98f2e5SJia-Ju Bai phys_bytes buf_dma; 1698d98f2e5SJia-Ju Bai char *buf; 170*3afdc120SJia-Ju Bai } rx[RX_BUFFER_NUM]; 1718d98f2e5SJia-Ju Bai 1728d98f2e5SJia-Ju Bai /* Tx data */ 1738d98f2e5SJia-Ju Bai int tx_head; 1748d98f2e5SJia-Ju Bai int tx_tail; 1758d98f2e5SJia-Ju Bai struct { 1768d98f2e5SJia-Ju Bai int busy; 1778d98f2e5SJia-Ju Bai phys_bytes buf_dma; 1788d98f2e5SJia-Ju Bai char *buf; 179*3afdc120SJia-Ju Bai } tx[TX_BUFFER_NUM]; 180*3afdc120SJia-Ju Bai int tx_busy_num; /* Number of busy Tx buffer */ 181*3afdc120SJia-Ju Bai 182*3afdc120SJia-Ju Bai NDR_desc *rx_desc; /* Rx descriptor buffer */ 183*3afdc120SJia-Ju Bai phys_bytes rx_desc_dma; /* Rx descriptor DMA buffer */ 184*3afdc120SJia-Ju Bai NDR_desc *tx_desc; /* Tx descriptor buffer */ 1858d98f2e5SJia-Ju Bai phys_bytes tx_desc_dma; /* Tx descriptor DMA buffer */ 1868d98f2e5SJia-Ju Bai 1878d98f2e5SJia-Ju Bai int hook; /* IRQ hook id at kernel */ 188*3afdc120SJia-Ju Bai } NDR_driver; 1898d98f2e5SJia-Ju Bai 1908d98f2e5SJia-Ju Bai #endif 191