1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #define I82586_MEMZ (64 * 1024)
27
28 #define I82586_SCP_ADDR (I82586_MEMZ - sizeof(scp_t))
29
30 #define ADDR_LEN 6
31 #define I82586NULL 0xFFFF
32
33 #define toff(t,p,f) (unsigned short)((void *)(&((t *)((void *)0 + (p)))->f) - (void *)0)
34
35
36
37
38 typedef struct scp_t scp_t;
39 struct scp_t
40 {
41 unsigned short scp_sysbus;
42 #define SCP_SY_16BBUS (0x0 << 0)
43 #define SCP_SY_8BBUS (0x1 << 0)
44 unsigned short scp_junk[2];
45 unsigned short scp_iscpl;
46 unsigned short scp_iscph;
47 };
48
49
50
51
52 typedef struct iscp_t iscp_t;
53 struct iscp_t
54 {
55 unsigned short iscp_busy;
56
57 unsigned short iscp_offset;
58 unsigned short iscp_basel;
59 unsigned short iscp_baseh;
60 };
61
62
63
64
65
66
67
68
69 typedef struct scb_t scb_t;
70 struct scb_t
71 {
72 unsigned short scb_status;
73 #define SCB_ST_INT (0xF << 12)
74 #define SCB_ST_CX (0x1 << 15)
75 #define SCB_ST_FR (0x1 << 14)
76 #define SCB_ST_CNA (0x1 << 13)
77 #define SCB_ST_RNR (0x1 << 12)
78 #define SCB_ST_JUNK0 (0x1 << 11)
79 #define SCB_ST_CUS (0x7 << 8)
80 #define SCB_ST_CUS_IDLE (0 << 8)
81 #define SCB_ST_CUS_SUSP (1 << 8)
82 #define SCB_ST_CUS_ACTV (2 << 8)
83 #define SCB_ST_JUNK1 (0x1 << 7)
84 #define SCB_ST_RUS (0x7 << 4)
85 #define SCB_ST_RUS_IDLE (0 << 4)
86 #define SCB_ST_RUS_SUSP (1 << 4)
87 #define SCB_ST_RUS_NRES (2 << 4)
88 #define SCB_ST_RUS_RDY (4 << 4)
89 unsigned short scb_command;
90 #define SCB_CMD_ACK_CX (0x1 << 15)
91 #define SCB_CMD_ACK_FR (0x1 << 14)
92 #define SCB_CMD_ACK_CNA (0x1 << 13)
93 #define SCB_CMD_ACK_RNR (0x1 << 12)
94 #define SCB_CMD_JUNKX (0x1 << 11)
95 #define SCB_CMD_CUC (0x7 << 8)
96 #define SCB_CMD_CUC_NOP (0 << 8)
97 #define SCB_CMD_CUC_GO (1 << 8)
98 #define SCB_CMD_CUC_RES (2 << 8)
99 #define SCB_CMD_CUC_SUS (3 << 8)
100 #define SCB_CMD_CUC_ABT (4 << 8)
101 #define SCB_CMD_RESET (0x1 << 7)
102 #define SCB_CMD_RUC (0x7 << 4)
103 #define SCB_CMD_RUC_NOP (0 << 4)
104 #define SCB_CMD_RUC_GO (1 << 4)
105 #define SCB_CMD_RUC_RES (2 << 4)
106 #define SCB_CMD_RUC_SUS (3 << 4)
107 #define SCB_CMD_RUC_ABT (4 << 4)
108 unsigned short scb_cbl_offset;
109
110 unsigned short scb_rfa_offset;
111
112
113 unsigned short scb_crcerrs;
114
115 unsigned short scb_alnerrs;
116
117 unsigned short scb_rscerrs;
118 unsigned short scb_ovrnerrs;
119 };
120
121 #define scboff(p,f) toff(scb_t, p, f)
122
123
124
125
126 typedef enum acmd_e acmd_e;
127 enum acmd_e
128 {
129 acmd_nop = 0,
130 acmd_ia_setup = 1,
131
132 acmd_configure = 2,
133 acmd_mc_setup = 3,
134
135 acmd_transmit = 4,
136 acmd_tdr = 5,
137
138 acmd_dump = 6,
139 acmd_diagnose = 7,
140 };
141
142
143
144
145 typedef struct ach_t ach_t;
146 struct ach_t
147 {
148 unsigned short ac_status;
149 #define AC_SFLD_C (0x1 << 15)
150 #define AC_SFLD_B (0x1 << 14)
151 #define AC_SFLD_OK (0x1 << 13)
152 #define AC_SFLD_A (0x1 << 12)
153 #define AC_SFLD_FAIL (0x1 << 11)
154 #define AC_SFLD_S10 (0x1 << 10)
155
156 #define AC_SFLD_S9 (0x1 << 9)
157
158 #define AC_SFLD_S8 (0x1 << 8)
159
160 #define AC_SFLD_S7 (0x1 << 7)
161
162 #define AC_SFLD_S6 (0x1 << 6)
163
164 #define AC_SFLD_S5 (0x1 << 5)
165
166 #define AC_SFLD_MAXCOL (0xF << 0)
167 unsigned short ac_command;
168 #define AC_CFLD_EL (0x1 << 15)
169 #define AC_CFLD_S (0x1 << 14)
170 #define AC_CFLD_I (0x1 << 13)
171 #define AC_CFLD_CMD (0x7 << 0)
172 unsigned short ac_link;
173 };
174
175 #define acoff(p,f) toff(ach_t, p, f)
176
177
178
179
180 typedef struct ac_nop_t ac_nop_t;
181 struct ac_nop_t
182 {
183 ach_t nop_h;
184 };
185
186
187
188
189 typedef struct ac_ias_t ac_ias_t;
190 struct ac_ias_t
191 {
192 ach_t ias_h;
193 unsigned char ias_addr[ADDR_LEN];
194 };
195
196
197
198
199 typedef struct ac_cfg_t ac_cfg_t;
200 struct ac_cfg_t
201 {
202 ach_t cfg_h;
203 unsigned char cfg_byte_cnt;
204 #define AC_CFG_BYTE_CNT(v) (((v) & 0xF) << 0)
205 unsigned char cfg_fifolim;
206 #define AC_CFG_FIFOLIM(v) (((v) & 0xF) << 0)
207 unsigned char cfg_byte8;
208 #define AC_CFG_SAV_BF(v) (((v) & 0x1) << 7)
209 #define AC_CFG_SRDY(v) (((v) & 0x1) << 6)
210
211 unsigned char cfg_byte9;
212 #define AC_CFG_ELPBCK(v) (((v) & 0x1) << 7)
213 #define AC_CFG_ILPBCK(v) (((v) & 0x1) << 6)
214 #define AC_CFG_PRELEN(v) (((v) & 0x3) << 4)
215 #define AC_CFG_PLEN_2 0
216 #define AC_CFG_PLEN_4 1
217 #define AC_CFG_PLEN_8 2
218 #define AC_CFG_PLEN_16 3
219 #define AC_CFG_ALOC(v) (((v) & 0x1) << 3)
220
221 #define AC_CFG_ADDRLEN(v) (((v) & 0x7) << 0)
222 unsigned char cfg_byte10;
223 #define AC_CFG_BOFMET(v) (((v) & 0x1) << 7)
224
225 #define AC_CFG_ACR(v) (((v) & 0x7) << 4)
226 #define AC_CFG_LINPRIO(v) (((v) & 0x7) << 0)
227 unsigned char cfg_ifs;
228 unsigned char cfg_slotl;
229 unsigned char cfg_byte13;
230 #define AC_CFG_RETRYNUM(v) (((v) & 0xF) << 4)
231 #define AC_CFG_SLTTMHI(v) (((v) & 0x7) << 0)
232 unsigned char cfg_byte14;
233 #define AC_CFG_FLGPAD(v) (((v) & 0x1) << 7)
234 #define AC_CFG_BTSTF(v) (((v) & 0x1) << 6)
235 #define AC_CFG_CRC16(v) (((v) & 0x1) << 5)
236 #define AC_CFG_NCRC(v) (((v) & 0x1) << 4)
237 #define AC_CFG_TNCRS(v) (((v) & 0x1) << 3)
238 #define AC_CFG_MANCH(v) (((v) & 0x1) << 2)
239 #define AC_CFG_BCDIS(v) (((v) & 0x1) << 1)
240 #define AC_CFG_PRM(v) (((v) & 0x1) << 0)
241 unsigned char cfg_byte15;
242 #define AC_CFG_ICDS(v) (((v) & 0x1) << 7)
243
244 #define AC_CFG_CDTF(v) (((v) & 0x7) << 4)
245
246 #define AC_CFG_ICSS(v) (((v) & 0x1) << 3)
247
248 #define AC_CFG_CSTF(v) (((v) & 0x7) << 0)
249
250 unsigned short cfg_min_frm_len;
251 #define AC_CFG_MNFRM(v) (((v) & 0xFF) << 0)
252 };
253
254
255
256
257 typedef struct ac_mcs_t ac_mcs_t;
258 struct ac_mcs_t
259 {
260 ach_t mcs_h;
261 unsigned short mcs_cnt;
262 unsigned short mcs_data[3];
263 };
264
265
266
267
268 typedef struct ac_tx_t ac_tx_t;
269 struct ac_tx_t
270 {
271 ach_t tx_h;
272 unsigned short tx_tbd_offset;
273 #if 0
274 Linux packets are passed down with the destination MAC address
275 and length/type field already prepended to the data,
276 so we do not need to insert it. Consistent with this
277 we must also set the AC_CFG_ALOC(..) flag during the
278 ac_cfg_t action command.
279 unsigned char tx_addr[ADDR_LEN];
280 unsigned short tx_length;
281 #endif
282 };
283
284
285
286
287 typedef struct ac_tdr_t ac_tdr_t;
288 struct ac_tdr_t
289 {
290 ach_t tdr_h;
291 unsigned short tdr_result;
292 #define AC_TDR_LNK_OK (0x1 << 15)
293 #define AC_TDR_XCVR_PRB (0x1 << 14)
294 #define AC_TDR_ET_OPN (0x1 << 13)
295 #define AC_TDR_ET_SRT (0x1 << 12)
296 #define AC_TDR_TIME (0x7FF << 0)
297
298
299 };
300
301
302
303
304 typedef struct ac_dmp_t ac_dmp_t;
305 struct ac_dmp_t
306 {
307 ach_t dmp_h;
308 unsigned short dmp_offset;
309 };
310
311
312
313
314 #define DUMPBYTES 170
315
316
317
318
319 typedef struct ac_dgn_t ac_dgn_t;
320 struct ac_dgn_t
321 {
322 ach_t dgn_h;
323 };
324
325
326
327
328 typedef struct tbd_t tbd_t;
329 struct tbd_t
330 {
331 unsigned short tbd_status;
332 #define TBD_STATUS_EOF (0x1 << 15)
333
334 #define TBD_STATUS_ACNT (0x3FFF << 0)
335
336 unsigned short tbd_next_bd_offset;
337 unsigned short tbd_bufl;
338 unsigned short tbd_bufh;
339 };
340
341
342
343
344 typedef struct rbd_t rbd_t;
345 struct rbd_t
346 {
347 unsigned short rbd_status;
348 #define RBD_STATUS_EOF (0x1 << 15)
349
350 #define RBD_STATUS_F (0x1 << 14)
351 #define RBD_STATUS_ACNT (0x3FFF << 0)
352
353 unsigned short rbd_next_rbd_offset;
354 unsigned short rbd_bufl;
355 unsigned short rbd_bufh;
356 unsigned short rbd_el_size;
357 #define RBD_EL (0x1 << 15)
358
359 #define RBD_SIZE (0x3FFF << 0)
360
361 };
362
363 #define rbdoff(p,f) toff(rbd_t, p, f)
364
365
366
367
368 typedef struct fd_t fd_t;
369 struct fd_t
370 {
371 unsigned short fd_status;
372 #define FD_STATUS_C (0x1 << 15)
373 #define FD_STATUS_B (0x1 << 14)
374 #define FD_STATUS_OK (0x1 << 13)
375 #define FD_STATUS_S11 (0x1 << 11)
376 #define FD_STATUS_S10 (0x1 << 10)
377 #define FD_STATUS_S9 (0x1 << 9)
378 #define FD_STATUS_S8 (0x1 << 8)
379 #define FD_STATUS_S7 (0x1 << 7)
380 #define FD_STATUS_S6 (0x1 << 6)
381 unsigned short fd_command;
382 #define FD_COMMAND_EL (0x1 << 15)
383 #define FD_COMMAND_S (0x1 << 14)
384 unsigned short fd_link_offset;
385 unsigned short fd_rbd_offset;
386
387
388 #if 0
389 I think the rest is unused since we
390 have set AC_CFG_ALOC(..). However, just
391 in case, we leave the space.
392 #endif
393 unsigned char fd_dest[ADDR_LEN];
394
395 unsigned char fd_src[ADDR_LEN];
396
397 unsigned short fd_length;
398
399 };
400
401 #define fdoff(p,f) toff(fd_t, p, f)
402
403
404
405
406
407
408