mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-25 20:14:25 +08:00
6aa20a2235
Signed-off-by: Jeff Garzik <jeff@garzik.org>
294 lines
6.4 KiB
C
294 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 */
|
|
struct net_device_stats stats;
|
|
|
|
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;
|