1
2
3
4
5
6
7#define ELP_DMA 6
8#define ELP_RX_PCBS 4
9#define ELP_MAX_CARDS 4
10
11
12
13
14#define PORT_COMMAND 0x00
15#define PORT_STATUS 0x02
16#define PORT_AUXDMA 0x02
17#define PORT_DATA 0x04
18#define PORT_CONTROL 0x06
19
20#define ELP_IO_EXTENT 0x10
21
22
23
24
25#define ATTN 0x80
26#define FLSH 0x40
27#define DMAE 0x20
28#define DIR 0x10
29#define TCEN 0x08
30#define CMDE 0x04
31#define HSF2 0x02
32#define HSF1 0x01
33
34
35
36
37#define HSF_PCB_ACK HSF1
38#define HSF_PCB_NAK HSF2
39#define HSF_PCB_END (HSF2|HSF1)
40#define HSF_PCB_MASK (HSF2|HSF1)
41
42
43
44
45#define HRDY 0x80
46#define HCRE 0x40
47#define ACRF 0x20
48
49#define DONE 0x08
50#define ASF3 0x04
51#define ASF2 0x02
52#define ASF1 0x01
53
54
55
56
57#define ASF_PCB_ACK ASF1
58#define ASF_PCB_NAK ASF2
59#define ASF_PCB_END (ASF2|ASF1)
60#define ASF_PCB_MASK (ASF2|ASF1)
61
62
63
64
65#define DMA_BRST 0x01
66
67
68
69
70#define MAX_PCB_DATA 62
71
72
73
74
75
76
77
78
79
80
81#define TIMEOUT 300
82
83
84
85
86
87
88
89enum {
90
91
92
93 CMD_CONFIGURE_ADAPTER_MEMORY = 0x01,
94 CMD_CONFIGURE_82586 = 0x02,
95 CMD_STATION_ADDRESS = 0x03,
96 CMD_DMA_DOWNLOAD = 0x04,
97 CMD_DMA_UPLOAD = 0x05,
98 CMD_PIO_DOWNLOAD = 0x06,
99 CMD_PIO_UPLOAD = 0x07,
100 CMD_RECEIVE_PACKET = 0x08,
101 CMD_TRANSMIT_PACKET = 0x09,
102 CMD_NETWORK_STATISTICS = 0x0a,
103 CMD_LOAD_MULTICAST_LIST = 0x0b,
104 CMD_CLEAR_PROGRAM = 0x0c,
105 CMD_DOWNLOAD_PROGRAM = 0x0d,
106 CMD_EXECUTE_PROGRAM = 0x0e,
107 CMD_SELF_TEST = 0x0f,
108 CMD_SET_STATION_ADDRESS = 0x10,
109 CMD_ADAPTER_INFO = 0x11,
110 NUM_TRANSMIT_CMDS,
111
112
113
114
115 CMD_CONFIGURE_ADAPTER_RESPONSE = 0x31,
116 CMD_CONFIGURE_82586_RESPONSE = 0x32,
117 CMD_ADDRESS_RESPONSE = 0x33,
118 CMD_DOWNLOAD_DATA_REQUEST = 0x34,
119 CMD_UPLOAD_DATA_REQUEST = 0x35,
120 CMD_RECEIVE_PACKET_COMPLETE = 0x38,
121 CMD_TRANSMIT_PACKET_COMPLETE = 0x39,
122 CMD_NETWORK_STATISTICS_RESPONSE = 0x3a,
123 CMD_LOAD_MULTICAST_RESPONSE = 0x3b,
124 CMD_CLEAR_PROGRAM_RESPONSE = 0x3c,
125 CMD_DOWNLOAD_PROGRAM_RESPONSE = 0x3d,
126 CMD_EXECUTE_RESPONSE = 0x3e,
127 CMD_SELF_TEST_RESPONSE = 0x3f,
128 CMD_SET_ADDRESS_RESPONSE = 0x40,
129 CMD_ADAPTER_INFO_RESPONSE = 0x41
130};
131
132
133
134
135typedef unsigned char byte;
136typedef unsigned short int word;
137typedef unsigned long int dword;
138
139
140struct Memconf {
141 word cmd_q,
142 rcv_q,
143 mcast,
144 frame,
145 rcv_b,
146 progs;
147};
148
149struct Rcv_pkt {
150 word buf_ofs,
151 buf_seg,
152 buf_len,
153 timeout;
154};
155
156struct Xmit_pkt {
157 word buf_ofs,
158 buf_seg,
159 pkt_len;
160};
161
162struct Rcv_resp {
163 word buf_ofs,
164 buf_seg,
165 buf_len,
166 pkt_len,
167 timeout,
168 status;
169 dword timetag;
170};
171
172struct Xmit_resp {
173 word buf_ofs,
174 buf_seg,
175 c_stat,
176 status;
177};
178
179
180struct Netstat {
181 dword tot_recv,
182 tot_xmit;
183 word err_CRC,
184 err_align,
185 err_res,
186 err_ovrrun;
187};
188
189
190struct Selftest {
191 word error;
192 union {
193 word ROM_cksum;
194 struct {
195 word ofs, seg;
196 } RAM;
197 word i82586;
198 } failure;
199};
200
201struct Info {
202 byte minor_vers,
203 major_vers;
204 word ROM_cksum,
205 RAM_sz,
206 free_ofs,
207 free_seg;
208};
209
210struct Memdump {
211 word size,
212 off,
213 seg;
214};
215
216
217
218
219
220
221typedef struct {
222 byte command;
223 byte length;
224 union {
225 struct Memconf memconf;
226 word configure;
227 struct Rcv_pkt rcv_pkt;
228 struct Xmit_pkt xmit_pkt;
229 byte multicast[10][6];
230 byte eth_addr[6];
231 byte failed;
232 struct Rcv_resp rcv_resp;
233 struct Xmit_resp xmit_resp;
234 struct Netstat netstat;
235 struct Selftest selftest;
236 struct Info info;
237 struct Memdump memdump;
238 byte raw[62];
239 } data;
240} pcb_struct;
241
242
243#define RECV_STATION 0x00
244#define RECV_BROAD 0x01
245#define RECV_MULTI 0x02
246#define RECV_PROMISC 0x04
247#define NO_LOOPBACK 0x00
248#define INT_LOOPBACK 0x08
249#define EXT_LOOPBACK 0x10
250
251
252
253
254
255
256
257#define DMA_BUFFER_SIZE 1600
258#define BACKLOG_SIZE 4
259
260typedef struct {
261 volatile short got[NUM_TRANSMIT_CMDS];
262
263 pcb_struct tx_pcb;
264 pcb_struct rx_pcb;
265 pcb_struct itx_pcb;
266 pcb_struct irx_pcb;
267
268 void *dma_buffer;
269
270 struct {
271 unsigned int length[BACKLOG_SIZE];
272 unsigned int in;
273 unsigned int out;
274 } rx_backlog;
275
276 struct {
277 unsigned int direction;
278 unsigned int length;
279 struct sk_buff *skb;
280 void *target;
281 unsigned long start_time;
282 } current_dma;
283
284
285 unsigned long send_pcb_semaphore;
286 unsigned long dmaing;
287 unsigned long busy;
288
289 unsigned int rx_active;
290 volatile unsigned char hcr_val;
291 spinlock_t lock;
292} elp_device;
293