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