xref: /minix3/minix/drivers/net/3c90x/3c90x.h (revision f7df02e7476731c31f12548e38bcadbaf0233f6a)
175e18fe4SDavid van Moolenbroek /* 3Com 3C90xB/C EtherLink driver, by D.C. van Moolenbroek */
275e18fe4SDavid van Moolenbroek #ifndef _DRIVERS_NET_3C90X_H
375e18fe4SDavid van Moolenbroek #define _DRIVERS_NET_3C90X_H
475e18fe4SDavid van Moolenbroek 
575e18fe4SDavid van Moolenbroek /* The following time values are in microseconds (us). */
675e18fe4SDavid van Moolenbroek #define XLBC_CMD_TIMEOUT		1000	/* command timeout */
775e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_TIMEOUT		500	/* EEPROM read timeout */
875e18fe4SDavid van Moolenbroek #define XLBC_AUTONEG_TIMEOUT		2000000	/* auto-negotiation timeout */
975e18fe4SDavid van Moolenbroek #define XLBC_RESET_DELAY		1000	/* wait time for reset */
1075e18fe4SDavid van Moolenbroek #define XLBC_MII_DELAY			1	/* MII cycle response time */
1175e18fe4SDavid van Moolenbroek 
1275e18fe4SDavid van Moolenbroek /*
1375e18fe4SDavid van Moolenbroek  * Transmission and receipt memory parameters.  The current values allow for
1475e18fe4SDavid van Moolenbroek  * buffering of about 32 full-size packets, requiring 48KB of memory for each
1575e18fe4SDavid van Moolenbroek  * direction (and thus 96KB in total).  For transmission, it is possible to
1675e18fe4SDavid van Moolenbroek  * queue many more small packets using the same memory area.  For receipt, it
1775e18fe4SDavid van Moolenbroek  * is not, since each incoming packet may be of full size.  This explains the
1875e18fe4SDavid van Moolenbroek  * seemingly huge difference in descriptor counts.
1975e18fe4SDavid van Moolenbroek  */
2075e18fe4SDavid van Moolenbroek #define XLBC_DPD_COUNT			256	/* TX descriptor count */
2175e18fe4SDavid van Moolenbroek #define XLBC_TXB_SIZE			48128	/* TX buffer size in bytes */
2275e18fe4SDavid van Moolenbroek #define XLBC_UPD_COUNT			32	/* RX descriptor count */
2375e18fe4SDavid van Moolenbroek 
24*f7df02e7SDavid van Moolenbroek #define XLBC_MIN_PKT_LEN		NDEV_ETH_PACKET_MIN
25*f7df02e7SDavid van Moolenbroek #define XLBC_MAX_PKT_LEN		NDEV_ETH_PACKET_MAX_TAGGED
2675e18fe4SDavid van Moolenbroek 
2775e18fe4SDavid van Moolenbroek #define XLBC_MIN_REG_SIZE		128	/* min. register memory size */
2875e18fe4SDavid van Moolenbroek 
2975e18fe4SDavid van Moolenbroek #define XLBC_CMD_REG			0x0e	/* command register */
3075e18fe4SDavid van Moolenbroek #	define XLBC_CMD_GLOBAL_RESET	0x0000	/* perform overall NIC reset */
3175e18fe4SDavid van Moolenbroek #	define XLBC_CMD_RX_RESET	0x2800	/* perform receiver reset */
3275e18fe4SDavid van Moolenbroek #	define XLBC_CMD_TX_RESET	0x5800	/* perform transmitter reset */
3375e18fe4SDavid van Moolenbroek #	define XLBC_CMD_DN_STALL	0x3002	/* stall download */
3475e18fe4SDavid van Moolenbroek #	define XLBC_CMD_DN_UNSTALL	0x3003	/* unstall download */
3575e18fe4SDavid van Moolenbroek #	define XLBC_CMD_TX_ENABLE	0x4800	/* enable transmission */
3675e18fe4SDavid van Moolenbroek #	define XLBC_CMD_RX_ENABLE	0x2000	/* enable receipt */
3775e18fe4SDavid van Moolenbroek #	define XLBC_CMD_SET_FILTER	0x8000	/* set receipt filter */
3875e18fe4SDavid van Moolenbroek #	define XLBC_CMD_UP_UNSTALL	0x3001	/* unstall upload */
3975e18fe4SDavid van Moolenbroek #	define XLBC_CMD_IND_ENABLE	0x7800	/* enable indications */
4075e18fe4SDavid van Moolenbroek #	define XLBC_CMD_INT_ENABLE	0x7000	/* enable interrupts */
4175e18fe4SDavid van Moolenbroek #	define XLBC_CMD_SELECT_WINDOW	0x0800	/* select register window */
4275e18fe4SDavid van Moolenbroek #	define XLBC_CMD_STATS_ENABLE	0xa800	/* enable statistics */
4375e18fe4SDavid van Moolenbroek 
4475e18fe4SDavid van Moolenbroek #define XLBC_FILTER_STATION		0x01	/* packets addressed to NIC */
4575e18fe4SDavid van Moolenbroek #define XLBC_FILTER_MULTI		0x02	/* multicast packets */
4675e18fe4SDavid van Moolenbroek #define XLBC_FILTER_BROAD		0x04	/* broadcast packets */
4775e18fe4SDavid van Moolenbroek #define XLBC_FILTER_PROMISC		0x08	/* all packets (promiscuous) */
4875e18fe4SDavid van Moolenbroek 
4975e18fe4SDavid van Moolenbroek #define XLBC_STATUS_REG			0x0e	/* interupt status register */
5075e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_HOST_ERROR	0x0002	/* catastrophic host error */
5175e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_TX_COMPLETE	0x0004	/* packet transmission done */
5275e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_UPDATE_STATS	0x0080	/* statistics need retrieval */
5375e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_LINK_EVENT	0x0100	/* link status change event */
5475e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_DN_COMPLETE	0x0200	/* packet download completed */
5575e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_UP_COMPLETE	0x0400	/* packet upload completed */
5675e18fe4SDavid van Moolenbroek #	define XLBC_STATUS_IN_PROGRESS	0x1000	/* command still in progress */
5775e18fe4SDavid van Moolenbroek 
5875e18fe4SDavid van Moolenbroek /* The mask of interrupts in which we are interested. */
5975e18fe4SDavid van Moolenbroek #define XLBC_STATUS_MASK \
6075e18fe4SDavid van Moolenbroek 	(XLBC_STATUS_HOST_ERROR | \
6175e18fe4SDavid van Moolenbroek 	XLBC_STATUS_TX_COMPLETE | \
6275e18fe4SDavid van Moolenbroek 	XLBC_STATUS_UPDATE_STATS | \
6375e18fe4SDavid van Moolenbroek 	XLBC_STATUS_LINK_EVENT | \
6475e18fe4SDavid van Moolenbroek 	XLBC_STATUS_DN_COMPLETE | \
6575e18fe4SDavid van Moolenbroek 	XLBC_STATUS_UP_COMPLETE)
6675e18fe4SDavid van Moolenbroek 
6775e18fe4SDavid van Moolenbroek #define XLBC_TX_STATUS_REG		0x1b	/* TX status register */
6875e18fe4SDavid van Moolenbroek #	define XLBC_TX_STATUS_OVERFLOW	0x04	/* TX status stack full */
6975e18fe4SDavid van Moolenbroek #	define XLBC_TX_STATUS_MAX_COLL	0x08	/* max collisions reached */
7075e18fe4SDavid van Moolenbroek #	define XLBC_TX_STATUS_UNDERRUN	0x10	/* packet transfer underrun */
7175e18fe4SDavid van Moolenbroek #	define XLBC_TX_STATUS_JABBER	0x20	/* transmitting for too long */
7275e18fe4SDavid van Moolenbroek #	define XLBC_TX_STATUS_COMPLETE	0x80	/* register contents valid */
7375e18fe4SDavid van Moolenbroek 
7475e18fe4SDavid van Moolenbroek #define XLBC_STATUS_AUTO_REG		0x1e	/* auto interrupt status reg */
7575e18fe4SDavid van Moolenbroek 
7675e18fe4SDavid van Moolenbroek #define XLBC_DMA_CTRL_REG		0x20	/* DMA control register */
7775e18fe4SDavid van Moolenbroek #	define XLBC_DMA_CTRL_DN_INPROG	0x00000080	/* dn in progress */
7875e18fe4SDavid van Moolenbroek #	define XLBC_DMA_CTRL_UP_NOALT	0x00010000	/* disable up altseq */
7975e18fe4SDavid van Moolenbroek #	define XLBC_DMA_CTRL_DN_NOALT	0x00020000	/* disable dn altseq */
8075e18fe4SDavid van Moolenbroek 
8175e18fe4SDavid van Moolenbroek #define XLBC_DN_LIST_PTR_REG		0x24	/* download pointer register */
8275e18fe4SDavid van Moolenbroek 
8375e18fe4SDavid van Moolenbroek #define XLBC_UP_LIST_PTR_REG		0x38	/* uplist pointer register */
8475e18fe4SDavid van Moolenbroek 
8575e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WINDOW		0	/* EEPROM register window */
8675e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_CMD_REG		0x0a	/* EEPROM command register */
8775e18fe4SDavid van Moolenbroek #	define XLBC_EEPROM_CMD_ADDR	0x003f	/* address mask */
8875e18fe4SDavid van Moolenbroek #	define XLBC_EEPROM_CMD_READ	0x0080	/* read register opcode */
8975e18fe4SDavid van Moolenbroek #	define XLBC_EEPROM_CMD_BUSY	0x8000	/* command in progress */
9075e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_DATA_REG		0x0c	/* EEPROM data register */
9175e18fe4SDavid van Moolenbroek 
9275e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WORD_OEM_ADDR0	0x0a	/* OEM node address, word 0 */
9375e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WORD_OEM_ADDR1	0x0b	/* OEM node address, word 1 */
9475e18fe4SDavid van Moolenbroek #define XLBC_EEPROM_WORD_OEM_ADDR2	0x0c	/* OEM node address, word 2 */
9575e18fe4SDavid van Moolenbroek 
9675e18fe4SDavid van Moolenbroek #define XLBC_STATION_WINDOW		2	/* station register window */
9775e18fe4SDavid van Moolenbroek #define XLBC_STATION_ADDR0_REG		0x00	/* station address, word 0 */
9875e18fe4SDavid van Moolenbroek #define XLBC_STATION_ADDR1_REG		0x02	/* station address, word 1 */
9975e18fe4SDavid van Moolenbroek #define XLBC_STATION_ADDR2_REG		0x04	/* station address, word 2 */
10075e18fe4SDavid van Moolenbroek #define XLBC_STATION_MASK0_REG		0x06	/* station mask, word 0 */
10175e18fe4SDavid van Moolenbroek #define XLBC_STATION_MASK1_REG		0x08	/* station mask, word 1 */
10275e18fe4SDavid van Moolenbroek #define XLBC_STATION_MASK2_REG		0x0a	/* station mask, word 2 */
10375e18fe4SDavid van Moolenbroek 
10475e18fe4SDavid van Moolenbroek #define XLBC_CONFIG_WINDOW		3	/* configuration window */
10575e18fe4SDavid van Moolenbroek #define XLBC_CONFIG_WORD1_REG		0x02	/* high-order 16 config bits */
10675e18fe4SDavid van Moolenbroek #	define XLBC_CONFIG_XCVR_MASK	0x00f0	/* transceiver selection */
10775e18fe4SDavid van Moolenbroek #	define XLBC_CONFIG_XCVR_AUTO	0x0080	/* auto-negotiation */
10875e18fe4SDavid van Moolenbroek 
10975e18fe4SDavid van Moolenbroek #define XLBC_MAC_CTRL_WINDOW		3	/* MAC control window */
11075e18fe4SDavid van Moolenbroek #define XLBC_MAC_CTRL_REG		0x06	/* MAC control register */
11175e18fe4SDavid van Moolenbroek #	define XLBC_MAC_CTRL_ENA_FD	0x0020	/* enable full duplex */
11275e18fe4SDavid van Moolenbroek 
11375e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_OPT_WINDOW		3	/* media options window */
11475e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_OPT_REG		0x08	/* media options register */
11575e18fe4SDavid van Moolenbroek #	define XLBC_MEDIA_OPT_BASE_TX	0x0002	/* 100BASE-TX available */
11675e18fe4SDavid van Moolenbroek #	define XLBC_MEDIA_OPT_10_BT	0x0008	/* 10BASE-T available */
11775e18fe4SDavid van Moolenbroek 
11875e18fe4SDavid van Moolenbroek #define XLBC_NET_DIAG_WINDOW		4	/* net diagnostics window */
11975e18fe4SDavid van Moolenbroek #define XLBC_NET_DIAG_REG		0x06	/* net diagnostics register */
12075e18fe4SDavid van Moolenbroek #	define XLBC_NET_DIAG_UPPER	0x0040	/* enable upper stats bytes */
12175e18fe4SDavid van Moolenbroek 
12275e18fe4SDavid van Moolenbroek #define XLBC_PHYS_MGMT_WINDOW		4	/* physical mgmt window */
12375e18fe4SDavid van Moolenbroek #define XLBC_PHYS_MGMT_REG		0x08	/* physical mgmt register */
12475e18fe4SDavid van Moolenbroek #	define XLBC_PHYS_MGMT_CLK	0x0001	/* MII management clock */
12575e18fe4SDavid van Moolenbroek #	define XLBC_PHYS_MGMT_DATA	0x0002	/* MII management data bit */
12675e18fe4SDavid van Moolenbroek #	define XLBC_PHYS_MGMT_DIR	0x0004	/* MII data direction bit */
12775e18fe4SDavid van Moolenbroek 
12875e18fe4SDavid van Moolenbroek #define XLBC_PHY_ADDR			0x18	/* internal PHY address */
12975e18fe4SDavid van Moolenbroek 
13075e18fe4SDavid van Moolenbroek #define XLBC_MII_CONTROL		0x00	/* MII control register */
13175e18fe4SDavid van Moolenbroek #	define XLBC_MII_CONTROL_AUTONEG	0x0200	/* restart auto-negotiation */
13275e18fe4SDavid van Moolenbroek #	define XLBC_MII_CONTROL_RESET	0x8000	/* reset the PHY */
13375e18fe4SDavid van Moolenbroek #define XLBC_MII_STATUS			0x01	/* MII status register */
13475e18fe4SDavid van Moolenbroek #	define XLBC_MII_STATUS_EXTCAP	0x0001	/* extended capability */
13575e18fe4SDavid van Moolenbroek #	define XLBC_MII_STATUS_AUTONEG	0x0008	/* auto-neg capability */
13675e18fe4SDavid van Moolenbroek #	define XLBC_MII_STATUS_COMPLETE	0x0020	/* auto-neg complete */
13775e18fe4SDavid van Moolenbroek #define XLBC_MII_AUTONEG_ADV		0x04	/* MII auto-neg advertise */
13875e18fe4SDavid van Moolenbroek #	define XLBC_MII_LINK_T_HD	0x0020	/* 10BASE-T half-duplex */
13975e18fe4SDavid van Moolenbroek #	define XLBC_MII_LINK_T_FD	0x0040	/* 10BASE-T full-duplex */
14075e18fe4SDavid van Moolenbroek #	define XLBC_MII_LINK_TX_HD	0x0080	/* 100BASE-TX half-duplex */
14175e18fe4SDavid van Moolenbroek #	define XLBC_MII_LINK_TX_FD	0x0100	/* 100BASE-TX full-duplex */
14275e18fe4SDavid van Moolenbroek #define XLBC_MII_LP_ABILITY		0x05	/* MII link partner ability */
14375e18fe4SDavid van Moolenbroek #define XLBC_MII_AUTONEG_EXP		0x06	/* MII auto-neg expansion */
14475e18fe4SDavid van Moolenbroek 
14575e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_STS_WINDOW		4	/* media status window */
14675e18fe4SDavid van Moolenbroek #define XLBC_MEDIA_STS_REG		0x0a	/* media status register */
14775e18fe4SDavid van Moolenbroek #	define XLBC_MEDIA_STS_LINK_DET	0x0800	/* link detected */
14875e18fe4SDavid van Moolenbroek #	define XLBC_MEDIA_STS_TX_INPROG	0x1000	/* TX in progress */
14975e18fe4SDavid van Moolenbroek 
15075e18fe4SDavid van Moolenbroek #define XLBC_SSD_STATS_WINDOW		4	/* SSD statistics window */
15175e18fe4SDavid van Moolenbroek #define XLBC_BAD_SSD_REG		0x0c	/* bad start-of-stream delim */
15275e18fe4SDavid van Moolenbroek 
15375e18fe4SDavid van Moolenbroek #define XLBC_STATS_WINDOW		6	/* statistics window */
15475e18fe4SDavid van Moolenbroek #define XLBC_CARRIER_LOST_REG		0x00	/* # packets w/ carrier lost */
15575e18fe4SDavid van Moolenbroek #define XLBC_SQE_ERR_REG		0x01	/* # SQE pulse errors */
15675e18fe4SDavid van Moolenbroek #define XLBC_MULTI_COLL_REG		0x02	/* # multiple collisions */
15775e18fe4SDavid van Moolenbroek #define XLBC_SINGLE_COLL_REG		0x03	/* # single collisions */
15875e18fe4SDavid van Moolenbroek #define XLBC_LATE_COLL_REG		0x04	/* # late collisions */
15975e18fe4SDavid van Moolenbroek #define XLBC_RX_OVERRUNS_REG		0x05	/* # receiver overruns */
16075e18fe4SDavid van Moolenbroek #define XLBC_FRAMES_XMIT_OK_REG		0x06	/* # frames transmitted */
16175e18fe4SDavid van Moolenbroek #define XLBC_FRAMES_RCVD_OK_REG		0x07	/* # frames received */
16275e18fe4SDavid van Moolenbroek #define XLBC_FRAMES_DEFERRED_REG	0x08	/* # frames deferred */
16375e18fe4SDavid van Moolenbroek #define XLBC_UPPER_FRAMES_REG		0x09	/* upper bits of frame stats */
16475e18fe4SDavid van Moolenbroek #	define XLBC_UPPER_RX_MASK	0x03	/* mask for frames received */
16575e18fe4SDavid van Moolenbroek #	define XLBC_UPPER_RX_SHIFT	0	/* shift for frames received */
16675e18fe4SDavid van Moolenbroek #	define XLBC_UPPER_TX_MASK	0x30	/* mask for frames sent */
16775e18fe4SDavid van Moolenbroek #	define XLBC_UPPER_TX_SHIFT	4	/* shift for frames sent */
16875e18fe4SDavid van Moolenbroek #define XLBC_BYTES_RCVD_OK_REG		0x0a	/* # bytes received */
16975e18fe4SDavid van Moolenbroek #define XLBC_BYTES_XMIT_OK_REG		0x0c	/* # bytes transmitted */
17075e18fe4SDavid van Moolenbroek 
17175e18fe4SDavid van Moolenbroek typedef struct {
17275e18fe4SDavid van Moolenbroek 	uint32_t next;		/* physical address of next descriptor */
17375e18fe4SDavid van Moolenbroek 	uint32_t flags;		/* frame start header or packet status */
17475e18fe4SDavid van Moolenbroek 	uint32_t addr;		/* address of first (and only) fragment */
17575e18fe4SDavid van Moolenbroek 	uint32_t len;		/* length of first (and only) fragment */
17675e18fe4SDavid van Moolenbroek } xlbc_pd_t;
17775e18fe4SDavid van Moolenbroek 
17875e18fe4SDavid van Moolenbroek /* Bits for the 'flags' field of download descriptors. */
17975e18fe4SDavid van Moolenbroek #define XLBC_DN_RNDUP_WORD		0x00000002	/* round up to word */
18075e18fe4SDavid van Moolenbroek #define XLBC_DN_DN_COMPLETE		0x00010000	/* download complete */
18175e18fe4SDavid van Moolenbroek #define XLBC_DN_DN_INDICATE		0x80000000	/* fire DN_COMPLETE */
18275e18fe4SDavid van Moolenbroek 
18375e18fe4SDavid van Moolenbroek /* Bits for the 'flags' field of upload descriptors. */
18475e18fe4SDavid van Moolenbroek #define XLBC_UP_LEN			0x00001fff	/* packet length */
18575e18fe4SDavid van Moolenbroek #define XLBC_UP_ERROR			0x00004000	/* receive error */
18675e18fe4SDavid van Moolenbroek #define XLBC_UP_COMPLETE		0x00008000	/* packet complete */
18775e18fe4SDavid van Moolenbroek #define XLBC_UP_OVERRUN			0x00010000	/* FIFO overrun */
18875e18fe4SDavid van Moolenbroek #define XLBC_UP_ALIGN_ERR		0x00040000	/* alignment error */
18975e18fe4SDavid van Moolenbroek #define XLBC_UP_CRC_ERR			0x00080000	/* CRC error */
19075e18fe4SDavid van Moolenbroek #define XLBC_UP_OVERFLOW		0x01000000	/* buffer too small */
19175e18fe4SDavid van Moolenbroek 
19275e18fe4SDavid van Moolenbroek /* Bits for the 'len' field of upload and download descriptors. */
19375e18fe4SDavid van Moolenbroek #define XLBC_LEN_LAST			0x80000000	/* last fragment */
19475e18fe4SDavid van Moolenbroek 
19575e18fe4SDavid van Moolenbroek #endif /* !_DRIVERS_NET_3C90X_H */
196