blob: 04df2a9002b62f00078fc6f5227ad80fdc8af2fc [file] [log] [blame]
/*****************************************************************
*
* 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;