 ba0f6caeb5
			
		
	
	
	ba0f6caeb5
	
	
	
		
			
			Use net_device_stats from net_device structure instead of local. No need to memset it to 0, because it is allocated by kzalloc. Signed-off-by: Paulius Zaleckas <paulius.zaleckas@teltonika.lt> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
		
			
				
	
	
		
			292 lines
		
	
	
	
		
			6.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
	
		
			6.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*****************************************************************
 | |
|  *
 | |
|  *  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 */
 | |
| 
 | |
| 	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;
 |