OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [net/] [i82586.h] - Blame information for rev 1777

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1626 jcastillo
/*
2
 * Intel 82586 IEEE 802.3 Ethernet LAN Coprocessor.
3
 *
4
 * See:
5
 *      Intel Microcommunications 1991
6
 *      p1-1 to p1-37
7
 *      Intel order No. 231658
8
 *      ISBN 1-55512-119-5
9
 *
10
 *     Unfortunately, the above chapter mentions neither
11
 * the System Configuration Pointer (SCP) nor the
12
 * Intermediate System Configuration Pointer (ISCP),
13
 * so we probably need to look elsewhere for the
14
 * whole story -- some recommend the "Intel LAN
15
 * Components manual" but I have neither a copy
16
 * nor a full reference.  But "elsewhere" may be
17
 * in the same publication...
18
 *     The description of a later device, the
19
 * "82596CA High-Performance 32-Bit Local Area Network
20
 * Coprocessor", (ibid. p1-38 to p1-109) does mention
21
 * the SCP and ISCP and also has an i82586 compatibility
22
 * mode.  Even more useful is "AP-235 An 82586 Data Link
23
 * Driver" (ibid. p1-337 to p1-417).
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
 * System Configuration Pointer (SCP).
37
 */
38
typedef struct scp_t    scp_t;
39
struct scp_t
40
{
41
        unsigned short  scp_sysbus;     /* 82586 bus width:     */
42
#define         SCP_SY_16BBUS   (0x0 << 0)      /* 16 bits */
43
#define         SCP_SY_8BBUS    (0x1 << 0)      /*  8 bits. */
44
        unsigned short  scp_junk[2];    /* Unused */
45
        unsigned short  scp_iscpl;      /* lower 16 bits of ISCP_ADDR */
46
        unsigned short  scp_iscph;      /* upper 16 bits of ISCP_ADDR */
47
};
48
 
49
/*
50
 * Intermediate System Configuration Pointer (ISCP).
51
 */
52
typedef struct iscp_t   iscp_t;
53
struct iscp_t
54
{
55
        unsigned short  iscp_busy;      /* set by CPU before first CA,  */
56
                                        /* cleared by 82586 after read. */
57
        unsigned short  iscp_offset;    /* offset of SCB                */
58
        unsigned short  iscp_basel;     /* base of SCB                  */
59
        unsigned short  iscp_baseh;     /*  "                           */
60
};
61
 
62
/*
63
 * System Control Block (SCB).
64
 *      The 82586 writes its status to scb_status and then
65
 *      raises an interrupt to alert the CPU.
66
 *      The CPU writes a command to scb_command and
67
 *      then issues a Channel Attention (CA) to alert the 82586.
68
 */
69
typedef struct scb_t    scb_t;
70
struct scb_t
71
{
72
        unsigned short  scb_status;     /* Status of 82586              */
73
#define         SCB_ST_INT      (0xF << 12)     /* Some of:             */
74
#define         SCB_ST_CX       (0x1 << 15)     /* Cmd completed        */
75
#define         SCB_ST_FR       (0x1 << 14)     /* Frame received       */
76
#define         SCB_ST_CNA      (0x1 << 13)     /* Cmd unit not active  */
77
#define         SCB_ST_RNR      (0x1 << 12)     /* Rcv unit not ready   */
78
#define         SCB_ST_JUNK0    (0x1 << 11)     /* 0                    */
79
#define         SCB_ST_CUS      (0x7 <<  8)     /* Cmd unit status      */
80
#define                 SCB_ST_CUS_IDLE (0 << 8)        /* Idle         */
81
#define                 SCB_ST_CUS_SUSP (1 << 8)        /* Suspended    */
82
#define                 SCB_ST_CUS_ACTV (2 << 8)        /* Active       */
83
#define         SCB_ST_JUNK1    (0x1 <<  7)     /* 0                    */
84
#define         SCB_ST_RUS      (0x7 <<  4)     /* Rcv unit status      */
85
#define                 SCB_ST_RUS_IDLE (0 << 4)        /* Idle         */
86
#define                 SCB_ST_RUS_SUSP (1 << 4)        /* Suspended    */
87
#define                 SCB_ST_RUS_NRES (2 << 4)        /* No resources */
88
#define                 SCB_ST_RUS_RDY  (4 << 4)        /* Ready        */
89
        unsigned short  scb_command;    /* Next command                 */
90
#define         SCB_CMD_ACK_CX  (0x1 << 15)     /* Ack cmd completion   */
91
#define         SCB_CMD_ACK_FR  (0x1 << 14)     /* Ack frame received   */
92
#define         SCB_CMD_ACK_CNA (0x1 << 13)     /* Ack CU not active    */
93
#define         SCB_CMD_ACK_RNR (0x1 << 12)     /* Ack RU not ready     */
94
#define         SCB_CMD_JUNKX   (0x1 << 11)     /* Unused               */
95
#define         SCB_CMD_CUC     (0x7 <<  8)     /* Command Unit command */
96
#define                 SCB_CMD_CUC_NOP (0 << 8)        /* Nop          */
97
#define                 SCB_CMD_CUC_GO  (1 << 8)        /* Start cbl_offset */
98
#define                 SCB_CMD_CUC_RES (2 << 8)        /* Resume execution */
99
#define                 SCB_CMD_CUC_SUS (3 << 8)        /* Suspend   "  */
100
#define                 SCB_CMD_CUC_ABT (4 << 8)        /* Abort     "  */
101
#define         SCB_CMD_RESET   (0x1 <<  7)     /* Reset chip (hardware) */
102
#define         SCB_CMD_RUC     (0x7 <<  4)     /* Receive Unit command */
103
#define                 SCB_CMD_RUC_NOP (0 << 4)        /* Nop          */
104
#define                 SCB_CMD_RUC_GO  (1 << 4)        /* Start rfa_offset */
105
#define                 SCB_CMD_RUC_RES (2 << 4)        /* Resume reception */
106
#define                 SCB_CMD_RUC_SUS (3 << 4)        /* Suspend   "  */
107
#define                 SCB_CMD_RUC_ABT (4 << 4)        /* Abort     "  */
108
        unsigned short  scb_cbl_offset; /* Offset of first command unit */
109
                                        /* Action Command               */
110
        unsigned short  scb_rfa_offset; /* Offset of first Receive      */
111
                                        /* Frame Descriptor in the      */
112
                                        /* Receive Frame Area           */
113
        unsigned short  scb_crcerrs;    /* Properly aligned frames      */
114
                                        /* received with a CRC error    */
115
        unsigned short  scb_alnerrs;    /* Misaligned frames received   */
116
                                        /* with a CRC error             */
117
        unsigned short  scb_rscerrs;    /* Frames lost due to no space  */
118
        unsigned short  scb_ovrnerrs;   /* Frames lost due to slow bus  */
119
};
120
 
121
#define scboff(p,f)     toff(scb_t, p, f)
122
 
123
/*
124
 * The eight Action Commands.
125
 */
126
typedef enum acmd_e     acmd_e;
127
enum acmd_e
128
{
129
        acmd_nop        = 0,     /* Do nothing                           */
130
        acmd_ia_setup   = 1,    /* Load an (ethernet) address into the  */
131
                                /* 82586                                */
132
        acmd_configure  = 2,    /* Update the 82586 operating parameters */
133
        acmd_mc_setup   = 3,    /* Load a list of (ethernet) multicast  */
134
                                /* addresses into the 82586             */
135
        acmd_transmit   = 4,    /* Transmit a frame                     */
136
        acmd_tdr        = 5,    /* Perform a Time Domain Reflectometer  */
137
                                /* test on the serial link              */
138
        acmd_dump       = 6,    /* Copy 82586 registers to memory       */
139
        acmd_diagnose   = 7,    /* Run an internal self test            */
140
};
141
 
142
/*
143
 * Generic Action Command header.
144
 */
145
typedef struct ach_t    ach_t;
146
struct ach_t
147
{
148
        unsigned short  ac_status;              /* Command status:      */
149
#define         AC_SFLD_C       (0x1 << 15)     /* Command completed    */
150
#define         AC_SFLD_B       (0x1 << 14)     /* Busy executing       */
151
#define         AC_SFLD_OK      (0x1 << 13)     /* Completed error free */
152
#define         AC_SFLD_A       (0x1 << 12)     /* Command aborted      */
153
#define         AC_SFLD_FAIL    (0x1 << 11)     /* Selftest failed      */
154
#define         AC_SFLD_S10     (0x1 << 10)     /* No carrier sense     */
155
                                                /* during transmission  */
156
#define         AC_SFLD_S9      (0x1 <<  9)     /* Tx unsuccessful:     */
157
                                                /* (stopped) lost CTS   */
158
#define         AC_SFLD_S8      (0x1 <<  8)     /* Tx unsuccessful:     */
159
                                                /* (stopped) slow DMA   */
160
#define         AC_SFLD_S7      (0x1 <<  7)     /* Tx deferred:         */
161
                                                /* other link traffic   */
162
#define         AC_SFLD_S6      (0x1 <<  6)     /* Heart Beat: collision */
163
                                                /* detect after last tx */
164
#define         AC_SFLD_S5      (0x1 <<  5)     /* Tx stopped:          */
165
                                                /* excessive collisions */
166
#define         AC_SFLD_MAXCOL  (0xF <<  0)     /* Collision count      */
167
        unsigned short  ac_command;             /* Command specifier:   */
168
#define         AC_CFLD_EL      (0x1 << 15)     /* End of command list  */
169
#define         AC_CFLD_S       (0x1 << 14)     /* Suspend on completion */
170
#define         AC_CFLD_I       (0x1 << 13)     /* Interrupt on completion */
171
#define         AC_CFLD_CMD     (0x7 <<  0)     /* acmd_e               */
172
        unsigned short  ac_link;                /* Next Action Command  */
173
};
174
 
175
#define acoff(p,f)      toff(ach_t, p, f)
176
 
177
/*
178
 * The Nop Action Command.
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
 * The IA-Setup Action Command.
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]; /* The (ethernet) address   */
194
};
195
 
196
/*
197
 * The Configure Action Command.
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;   /* Size foll data: 4-12 */
204
#define AC_CFG_BYTE_CNT(v)      (((v) & 0xF) << 0)
205
        unsigned char   cfg_fifolim;    /* FIFO threshold       */
206
#define AC_CFG_FIFOLIM(v)       (((v) & 0xF) << 0)
207
        unsigned char   cfg_byte8;
208
#define AC_CFG_SAV_BF(v)        (((v) & 0x1) << 7)      /* Save rxd bad frames  */
209
#define AC_CFG_SRDY(v)          (((v) & 0x1) << 6)      /* SRDY/ARDY pin means  */
210
                                                        /* external sync.       */
211
        unsigned char   cfg_byte9;
212
#define AC_CFG_ELPBCK(v)        (((v) & 0x1) << 7)      /* External loopback    */
213
#define AC_CFG_ILPBCK(v)        (((v) & 0x1) << 6)      /* Internal loopback    */
214
#define AC_CFG_PRELEN(v)        (((v) & 0x3) << 4)      /* Preamble length      */
215
#define         AC_CFG_PLEN_2           0                /*  2 bytes     */
216
#define         AC_CFG_PLEN_4           1               /*  4 bytes     */
217
#define         AC_CFG_PLEN_8           2               /*  8 bytes     */
218
#define         AC_CFG_PLEN_16          3               /* 16 bytes     */
219
#define AC_CFG_ALOC(v)          (((v) & 0x1) << 3)      /* Addr/len data is     */
220
                                                        /* explicit in buffers  */
221
#define AC_CFG_ADDRLEN(v)       (((v) & 0x7) << 0)      /* Bytes per address    */
222
        unsigned char   cfg_byte10;
223
#define AC_CFG_BOFMET(v)        (((v) & 0x1) << 7)      /* Use alternate expo.  */
224
                                                        /* backoff method       */
225
#define AC_CFG_ACR(v)           (((v) & 0x7) << 4)      /* Accelerated cont. res. */
226
#define AC_CFG_LINPRIO(v)       (((v) & 0x7) << 0)      /* Linear priority      */
227
        unsigned char   cfg_ifs;        /* Interframe spacing           */
228
        unsigned char   cfg_slotl;      /* Slot time (low byte)         */
229
        unsigned char   cfg_byte13;
230
#define AC_CFG_RETRYNUM(v)      (((v) & 0xF) << 4)      /* Max. collision retry */
231
#define AC_CFG_SLTTMHI(v)       (((v) & 0x7) << 0)      /* Slot time (high bits) */
232
        unsigned char   cfg_byte14;
233
#define AC_CFG_FLGPAD(v)        (((v) & 0x1) << 7)      /* Pad with HDLC flags  */
234
#define AC_CFG_BTSTF(v)         (((v) & 0x1) << 6)      /* Do HDLC bitstuffing  */
235
#define AC_CFG_CRC16(v)         (((v) & 0x1) << 5)      /* 16 bit CCITT CRC     */
236
#define AC_CFG_NCRC(v)          (((v) & 0x1) << 4)      /* Insert no CRC        */
237
#define AC_CFG_TNCRS(v)         (((v) & 0x1) << 3)      /* Tx even if no carrier */
238
#define AC_CFG_MANCH(v)         (((v) & 0x1) << 2)      /* Manchester coding    */
239
#define AC_CFG_BCDIS(v)         (((v) & 0x1) << 1)      /* Disable broadcast    */
240
#define AC_CFG_PRM(v)           (((v) & 0x1) << 0)      /* Promiscuous mode     */
241
        unsigned char   cfg_byte15;
242
#define AC_CFG_ICDS(v)          (((v) & 0x1) << 7)      /* Internal collision   */
243
                                                        /* detect source        */
244
#define AC_CFG_CDTF(v)          (((v) & 0x7) << 4)      /* Collision detect     */
245
                                                        /* filter in bit times  */
246
#define AC_CFG_ICSS(v)          (((v) & 0x1) << 3)      /* Internal carrier     */
247
                                                        /* sense source         */
248
#define AC_CFG_CSTF(v)          (((v) & 0x7) << 0)      /* Carrier sense        */
249
                                                        /* filter in bit times  */
250
        unsigned short  cfg_min_frm_len;
251
#define AC_CFG_MNFRM(v)         (((v) & 0xFF) << 0)     /* Min. bytes/frame (<= 255) */
252
};
253
 
254
/*
255
 * The MC-Setup Action Command.
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;        /* No. of bytes of MC addresses */
262
#if 0
263
        unsigned char   mcs_data[ADDR_LEN]; /* The first MC address ..  */
264
        ...
265
#endif
266
};
267
 
268
#define I82586_MAX_MULTICAST_ADDRESSES  128     /* Hardware hashed filter */
269
 
270
/*
271
 * The Transmit Action Command.
272
 */
273
typedef struct ac_tx_t  ac_tx_t;
274
struct ac_tx_t
275
{
276
        ach_t           tx_h;
277
        unsigned short  tx_tbd_offset;  /* Address of list of buffers.  */
278
#if     0
279
Linux packets are passed down with the destination MAC address
280
and length/type field already prepended to the data,
281
so we do not need to insert it.  Consistent with this
282
we must also set the AC_CFG_ALOC(..) flag during the
283
ac_cfg_t action command.
284
        unsigned char   tx_addr[ADDR_LEN]; /* The frame dest. address   */
285
        unsigned short  tx_length;      /* The frame length             */
286
#endif  /* 0 */
287
};
288
 
289
/*
290
 * The Time Domain Reflectometer Action Command.
291
 */
292
typedef struct ac_tdr_t ac_tdr_t;
293
struct ac_tdr_t
294
{
295
        ach_t           tdr_h;
296
        unsigned short  tdr_result;     /* Result.      */
297
#define         AC_TDR_LNK_OK   (0x1 << 15)     /* No link problem      */
298
#define         AC_TDR_XCVR_PRB (0x1 << 14)     /* Txcvr cable problem  */
299
#define         AC_TDR_ET_OPN   (0x1 << 13)     /* Open on the link     */
300
#define         AC_TDR_ET_SRT   (0x1 << 12)     /* Short on the link    */
301
#define         AC_TDR_TIME     (0x7FF << 0)    /* Distance to problem  */
302
                                                /* site in transmit     */
303
                                                /* clock cycles         */
304
};
305
 
306
/*
307
 * The Dump Action Command.
308
 */
309
typedef struct ac_dmp_t ac_dmp_t;
310
struct ac_dmp_t
311
{
312
        ach_t           dmp_h;
313
        unsigned short  dmp_offset;     /* Result.      */
314
};
315
 
316
/*
317
 * Size of the result of the dump command.
318
 */
319
#define DUMPBYTES       170
320
 
321
/*
322
 * The Diagnose Action Command.
323
 */
324
typedef struct ac_dgn_t ac_dgn_t;
325
struct ac_dgn_t
326
{
327
        ach_t           dgn_h;
328
};
329
 
330
/*
331
 * Transmit Buffer Descriptor (TBD).
332
 */
333
typedef struct tbd_t    tbd_t;
334
struct tbd_t
335
{
336
        unsigned short  tbd_status;             /* Written by the CPU   */
337
#define         TBD_STATUS_EOF  (0x1 << 15)     /* This TBD is the      */
338
                                                /* last for this frame  */
339
#define         TBD_STATUS_ACNT (0x3FFF << 0)   /* Actual count of data */
340
                                                /* bytes in this buffer */
341
        unsigned short  tbd_next_bd_offset;     /* Next in list         */
342
        unsigned short  tbd_bufl;               /* Buffer address (low) */
343
        unsigned short  tbd_bufh;               /*    "      "  (high)  */
344
};
345
 
346
/*
347
 * Receive Buffer Descriptor (RBD).
348
 */
349
typedef struct rbd_t    rbd_t;
350
struct rbd_t
351
{
352
        unsigned short  rbd_status;             /* Written by the 82586 */
353
#define         RBD_STATUS_EOF  (0x1 << 15)     /* This RBD is the      */
354
                                                /* last for this frame  */
355
#define         RBD_STATUS_F    (0x1 << 14)     /* ACNT field is valid  */
356
#define         RBD_STATUS_ACNT (0x3FFF << 0)   /* Actual no. of data   */
357
                                                /* bytes in this buffer */
358
        unsigned short  rbd_next_rbd_offset;    /* Next rbd in list     */
359
        unsigned short  rbd_bufl;               /* Data pointer (low)   */
360
        unsigned short  rbd_bufh;               /*  "      "    (high)  */
361
        unsigned short  rbd_el_size;            /* EL+Data buf. size    */
362
#define         RBD_EL  (0x1 << 15)             /* This BD is the       */
363
                                                /* last in the list     */
364
#define         RBD_SIZE (0x3FFF << 0)          /* No. of bytes the     */
365
                                                /* buffer can hold      */
366
};
367
 
368
#define rbdoff(p,f)     toff(rbd_t, p, f)
369
 
370
/*
371
 * Frame Descriptor (FD).
372
 */
373
typedef struct fd_t     fd_t;
374
struct fd_t
375
{
376
        unsigned short  fd_status;              /* Written by the 82586 */
377
#define         FD_STATUS_C     (0x1 << 15)     /* Completed storing frame */
378
#define         FD_STATUS_B     (0x1 << 14)     /* FD was consumed by RU */
379
#define         FD_STATUS_OK    (0x1 << 13)     /* Frame rxd successfully */
380
#define         FD_STATUS_S11   (0x1 << 11)     /* CRC error            */
381
#define         FD_STATUS_S10   (0x1 << 10)     /* Alignment error      */
382
#define         FD_STATUS_S9    (0x1 <<  9)     /* Ran out of resources */
383
#define         FD_STATUS_S8    (0x1 <<  8)     /* Rx DMA overrun       */
384
#define         FD_STATUS_S7    (0x1 <<  7)     /* Frame too short      */
385
#define         FD_STATUS_S6    (0x1 <<  6)     /* No EOF flag          */
386
        unsigned short  fd_command;             /* Command              */
387
#define         FD_COMMAND_EL   (0x1 << 15)     /* Last FD in list      */
388
#define         FD_COMMAND_S    (0x1 << 14)     /* Suspend RU after rx  */
389
        unsigned short  fd_link_offset;         /* Next FD              */
390
        unsigned short  fd_rbd_offset;          /* First RBD (data)     */
391
                                                /* Prepared by CPU,     */
392
                                                /* updated by 82586     */
393
#if     0
394
I think the rest is unused since we
395
have set AC_CFG_ALOC(..).  However, just
396
in case, we leave the space.
397
#endif  /* 0 */
398
        unsigned char   fd_dest[ADDR_LEN];      /* Destination address  */
399
                                                /* Written by 82586     */
400
        unsigned char   fd_src[ADDR_LEN];       /* Source address       */
401
                                                /* Written by 82586     */
402
        unsigned short  fd_length;              /* Frame length or type */
403
                                                /* Written by 82586     */
404
};
405
 
406
#define fdoff(p,f)      toff(fd_t, p, f)
407
 
408
/*
409
 * This software may only be used and distributed
410
 * according to the terms of the GNU Public License.
411
 *
412
 * For more details, see wavelan.c.
413
 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.