2005-04-17 02:20:36 +04:00
/*****************************************************************
*
* defines for 3 Com 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
2006-09-13 21:24:59 +04:00
* this is a rough value used for loops to stop them from
2005-04-17 02:20:36 +04:00
* 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 ;