| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*****************************************************************
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  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 | 
					
						
							| 
									
										
										
										
											2006-09-13 13:24:59 -04:00
										 |  |  |  *	this is a rough value used for loops to stop them from | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  *	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 */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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; |