xref: /minix3/minix/drivers/net/ip1000/ip1000.h (revision f7df02e7476731c31f12548e38bcadbaf0233f6a)
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