|  | /***************************************************************** | 
|  | * | 
|  | *  defines for 3Com Etherlink Plus adapter | 
|  | * | 
|  | *****************************************************************/ | 
|  |  | 
|  | #define ELP_DMA       6 | 
|  | #define ELP_RX_PCBS   4 | 
|  | #define ELP_MAX_CARDS 4 | 
|  |  | 
|  | /* | 
|  | * I/O register offsets | 
|  | */ | 
|  | #define	PORT_COMMAND	0x00	/* read/write, 8-bit */ | 
|  | #define	PORT_STATUS	0x02	/* read only, 8-bit */ | 
|  | #define	PORT_AUXDMA	0x02	/* write only, 8-bit */ | 
|  | #define	PORT_DATA	0x04	/* read/write, 16-bit */ | 
|  | #define	PORT_CONTROL	0x06	/* read/write, 8-bit */ | 
|  |  | 
|  | #define ELP_IO_EXTENT	0x10	/* size of used IO registers */ | 
|  |  | 
|  | /* | 
|  | * host control registers bits | 
|  | */ | 
|  | #define	ATTN	0x80	/* attention */ | 
|  | #define	FLSH	0x40	/* flush data register */ | 
|  | #define DMAE	0x20	/* DMA enable */ | 
|  | #define DIR	0x10	/* direction */ | 
|  | #define	TCEN	0x08	/* terminal count interrupt enable */ | 
|  | #define	CMDE	0x04	/* command register interrupt enable */ | 
|  | #define	HSF2	0x02	/* host status flag 2 */ | 
|  | #define	HSF1	0x01	/* host status flag 1 */ | 
|  |  | 
|  | /* | 
|  | * combinations of HSF flags used for PCB transmission | 
|  | */ | 
|  | #define	HSF_PCB_ACK	HSF1 | 
|  | #define	HSF_PCB_NAK	HSF2 | 
|  | #define	HSF_PCB_END	(HSF2|HSF1) | 
|  | #define	HSF_PCB_MASK	(HSF2|HSF1) | 
|  |  | 
|  | /* | 
|  | * host status register bits | 
|  | */ | 
|  | #define	HRDY	0x80	/* data register ready */ | 
|  | #define	HCRE	0x40	/* command register empty */ | 
|  | #define	ACRF	0x20	/* adapter command register full */ | 
|  | /* #define DIR 	0x10	direction - same as in control register */ | 
|  | #define	DONE	0x08	/* DMA done */ | 
|  | #define	ASF3	0x04	/* adapter status flag 3 */ | 
|  | #define	ASF2	0x02	/* adapter status flag 2 */ | 
|  | #define	ASF1	0x01	/* adapter status flag 1 */ | 
|  |  | 
|  | /* | 
|  | * combinations of ASF flags used for PCB reception | 
|  | */ | 
|  | #define	ASF_PCB_ACK	ASF1 | 
|  | #define	ASF_PCB_NAK	ASF2 | 
|  | #define	ASF_PCB_END	(ASF2|ASF1) | 
|  | #define	ASF_PCB_MASK	(ASF2|ASF1) | 
|  |  | 
|  | /* | 
|  | * host aux DMA register bits | 
|  | */ | 
|  | #define	DMA_BRST	0x01	/* DMA burst */ | 
|  |  | 
|  | /* | 
|  | * maximum amount of data allowed in a PCB | 
|  | */ | 
|  | #define	MAX_PCB_DATA	62 | 
|  |  | 
|  | /***************************************************************** | 
|  | * | 
|  | *  timeout value | 
|  | *	this is a rough value used for loops to stop them from | 
|  | *	locking up the whole machine in the case of failure or | 
|  | *	error conditions | 
|  | * | 
|  | *****************************************************************/ | 
|  |  | 
|  | #define	TIMEOUT	300 | 
|  |  | 
|  | /***************************************************************** | 
|  | * | 
|  | * PCB commands | 
|  | * | 
|  | *****************************************************************/ | 
|  |  | 
|  | enum { | 
|  | /* | 
|  | * host PCB commands | 
|  | */ | 
|  | CMD_CONFIGURE_ADAPTER_MEMORY	= 0x01, | 
|  | CMD_CONFIGURE_82586		= 0x02, | 
|  | CMD_STATION_ADDRESS		= 0x03, | 
|  | CMD_DMA_DOWNLOAD		= 0x04, | 
|  | CMD_DMA_UPLOAD		= 0x05, | 
|  | CMD_PIO_DOWNLOAD		= 0x06, | 
|  | CMD_PIO_UPLOAD		= 0x07, | 
|  | CMD_RECEIVE_PACKET		= 0x08, | 
|  | CMD_TRANSMIT_PACKET		= 0x09, | 
|  | CMD_NETWORK_STATISTICS	= 0x0a, | 
|  | CMD_LOAD_MULTICAST_LIST	= 0x0b, | 
|  | CMD_CLEAR_PROGRAM		= 0x0c, | 
|  | CMD_DOWNLOAD_PROGRAM		= 0x0d, | 
|  | CMD_EXECUTE_PROGRAM		= 0x0e, | 
|  | CMD_SELF_TEST			= 0x0f, | 
|  | CMD_SET_STATION_ADDRESS	= 0x10, | 
|  | CMD_ADAPTER_INFO		= 0x11, | 
|  | NUM_TRANSMIT_CMDS, | 
|  |  | 
|  | /* | 
|  | * adapter PCB commands | 
|  | */ | 
|  | CMD_CONFIGURE_ADAPTER_RESPONSE	= 0x31, | 
|  | CMD_CONFIGURE_82586_RESPONSE		= 0x32, | 
|  | CMD_ADDRESS_RESPONSE			= 0x33, | 
|  | CMD_DOWNLOAD_DATA_REQUEST		= 0x34, | 
|  | CMD_UPLOAD_DATA_REQUEST		= 0x35, | 
|  | CMD_RECEIVE_PACKET_COMPLETE		= 0x38, | 
|  | CMD_TRANSMIT_PACKET_COMPLETE		= 0x39, | 
|  | CMD_NETWORK_STATISTICS_RESPONSE	= 0x3a, | 
|  | CMD_LOAD_MULTICAST_RESPONSE		= 0x3b, | 
|  | CMD_CLEAR_PROGRAM_RESPONSE		= 0x3c, | 
|  | CMD_DOWNLOAD_PROGRAM_RESPONSE		= 0x3d, | 
|  | CMD_EXECUTE_RESPONSE			= 0x3e, | 
|  | CMD_SELF_TEST_RESPONSE		= 0x3f, | 
|  | CMD_SET_ADDRESS_RESPONSE		= 0x40, | 
|  | CMD_ADAPTER_INFO_RESPONSE		= 0x41 | 
|  | }; | 
|  |  | 
|  | /* Definitions for the PCB data structure */ | 
|  |  | 
|  | /* Data units */ | 
|  | typedef unsigned char         byte; | 
|  | typedef unsigned short int    word; | 
|  | typedef unsigned long int     dword; | 
|  |  | 
|  | /* Data structures */ | 
|  | struct Memconf { | 
|  | word	cmd_q, | 
|  | rcv_q, | 
|  | mcast, | 
|  | frame, | 
|  | rcv_b, | 
|  | progs; | 
|  | }; | 
|  |  | 
|  | struct Rcv_pkt { | 
|  | word	buf_ofs, | 
|  | buf_seg, | 
|  | buf_len, | 
|  | timeout; | 
|  | }; | 
|  |  | 
|  | struct Xmit_pkt { | 
|  | word	buf_ofs, | 
|  | buf_seg, | 
|  | pkt_len; | 
|  | }; | 
|  |  | 
|  | struct Rcv_resp { | 
|  | word	buf_ofs, | 
|  | buf_seg, | 
|  | buf_len, | 
|  | pkt_len, | 
|  | timeout, | 
|  | status; | 
|  | dword	timetag; | 
|  | }; | 
|  |  | 
|  | struct Xmit_resp { | 
|  | word	buf_ofs, | 
|  | buf_seg, | 
|  | c_stat, | 
|  | status; | 
|  | }; | 
|  |  | 
|  |  | 
|  | struct Netstat { | 
|  | dword	tot_recv, | 
|  | tot_xmit; | 
|  | word	err_CRC, | 
|  | err_align, | 
|  | err_res, | 
|  | err_ovrrun; | 
|  | }; | 
|  |  | 
|  |  | 
|  | struct Selftest { | 
|  | word	error; | 
|  | union { | 
|  | word ROM_cksum; | 
|  | struct { | 
|  | word ofs, seg; | 
|  | } RAM; | 
|  | word i82586; | 
|  | } failure; | 
|  | }; | 
|  |  | 
|  | struct Info { | 
|  | byte	minor_vers, | 
|  | major_vers; | 
|  | word	ROM_cksum, | 
|  | RAM_sz, | 
|  | free_ofs, | 
|  | free_seg; | 
|  | }; | 
|  |  | 
|  | struct Memdump { | 
|  | word size, | 
|  | off, | 
|  | seg; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | Primary Command Block. The most important data structure. All communication | 
|  | between the host and the adapter is done with these. (Except for the actual | 
|  | Ethernet data, which has different packaging.) | 
|  | */ | 
|  | typedef struct { | 
|  | byte	command; | 
|  | byte	length; | 
|  | union	{ | 
|  | struct Memconf		memconf; | 
|  | word			configure; | 
|  | struct Rcv_pkt		rcv_pkt; | 
|  | struct Xmit_pkt		xmit_pkt; | 
|  | byte			multicast[10][6]; | 
|  | byte			eth_addr[6]; | 
|  | byte			failed; | 
|  | struct Rcv_resp		rcv_resp; | 
|  | struct Xmit_resp	xmit_resp; | 
|  | struct Netstat		netstat; | 
|  | struct Selftest		selftest; | 
|  | struct Info		info; | 
|  | struct Memdump    	memdump; | 
|  | byte			raw[62]; | 
|  | } data; | 
|  | } pcb_struct; | 
|  |  | 
|  | /* These defines for 'configure' */ | 
|  | #define RECV_STATION	0x00 | 
|  | #define RECV_BROAD	0x01 | 
|  | #define RECV_MULTI	0x02 | 
|  | #define RECV_PROMISC	0x04 | 
|  | #define NO_LOOPBACK	0x00 | 
|  | #define INT_LOOPBACK	0x08 | 
|  | #define EXT_LOOPBACK	0x10 | 
|  |  | 
|  | /***************************************************************** | 
|  | * | 
|  | *  structure to hold context information for adapter | 
|  | * | 
|  | *****************************************************************/ | 
|  |  | 
|  | #define DMA_BUFFER_SIZE  1600 | 
|  | #define BACKLOG_SIZE      4 | 
|  |  | 
|  | typedef struct { | 
|  | volatile short got[NUM_TRANSMIT_CMDS];	/* flags for | 
|  | command completion */ | 
|  | pcb_struct tx_pcb;	/* PCB for foreground sending */ | 
|  | pcb_struct rx_pcb;	/* PCB for foreground receiving */ | 
|  | pcb_struct itx_pcb;	/* PCB for background sending */ | 
|  | pcb_struct irx_pcb;	/* PCB for background receiving */ | 
|  | struct net_device_stats stats; | 
|  |  | 
|  | void *dma_buffer; | 
|  |  | 
|  | struct { | 
|  | unsigned int length[BACKLOG_SIZE]; | 
|  | unsigned int in; | 
|  | unsigned int out; | 
|  | } rx_backlog; | 
|  |  | 
|  | struct { | 
|  | unsigned int direction; | 
|  | unsigned int length; | 
|  | struct sk_buff *skb; | 
|  | void *target; | 
|  | unsigned long start_time; | 
|  | } current_dma; | 
|  |  | 
|  | /* flags */ | 
|  | unsigned long send_pcb_semaphore; | 
|  | unsigned long dmaing; | 
|  | unsigned long busy; | 
|  |  | 
|  | unsigned int rx_active;  /* number of receive PCBs */ | 
|  | volatile unsigned char hcr_val;  /* what we think the HCR contains */ | 
|  | spinlock_t lock;	/* Interrupt v tx lock */ | 
|  | } elp_device; |