/***************************************************************** * * 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;